Что я пытаюсь сделать, так это использовать директиву @synchronized
для защиты одноэлементного объекта от одновременного доступа к нескольким потокам. Я также хочу постоянно хранить этот одноэлементный объект, записывая его на диск после каждого изменения, потому что очень важно стараться изо всех сил, чтобы не потерять какие-либо изменения в объекте.
Теперь я знаю, что многие из вас могут сказать, что не делайте этого; это занимает слишком много времени; это нехорошая практика и т.д. и т.п. Да, я знаю об этом. Это скорее "что будет?" вопрос.
Поэтому всякий раз, когда я собираюсь изменить объект-одиночку, я помещаю код модификации в блок @synchronized
, а затем записываю объект на диск. У меня была мысль использовать dispatch_async
для записи объекта в отдельный поток, например так:
//singleton object
id dataStructure;
@synchronized(lockObject)
{
//code that modifies singleton object
//not important
//sharedFileQueue is a SERIAL queue
dispatch_async([self sharedFileQueue], ^(void){
NSError * err;
NSData * plist = [NSPropertyListSerialization dataWithPropertyList:dataStructure
format:NSPropertyListBinaryFormat_v1_0
options:0 error:&err];
//url to somewhere
NSURL * url;
BOOL success = [plist writeToURL:url atomically:YES];
});
}
Итак, мое понимание @synchronized
заключается в том, что только один поток может выполнять этот блок кода за раз. Мое понимание dispatch_async
немного размыто, но я думаю, что это отправит блок в очередь отправки для асинхронного выполнения и немедленного возврата. Это означает, что если другой поток пройдет через мой блок @synchronized
, пока dataStructure
все еще записывается на диск, он просто отправит другой блок для запуска и запишет только что измененный dataStructure
на диск, но это не начнется, пока первый dataStructure
не будет записан на диск. диск.
Я правильно об этом думаю? Также будет ли параметр атомарно изменяться на YES
или NO
или сериализация моей очереди отправки гарантирует, что несколько потоков не будут записаны в этот файл одновременно?
Благодарю вас!