Защищает ли @synchronize от условий гонки в этом случае? - PullRequest
2 голосов
/ 01 июня 2011

Я хочу использовать Core Data в фоновых потоках и NSOperationQueue. Теперь я подумал, почему я не должен просто создать класс, содержащий все вещи из стека базовых данных, со свойством NSManagedObjectContext, а затем просто сделать это свойство атомарным?

Одна вещь, в которой я не уверен @synchronize(self) {...}, заключается в следующем: предположим, у меня есть свойство, которое считается поточно-безопасным:

@property (retain) NSManagedObjectContext *moc;

Каждый NSOperation или поток обращается к классу CoreDataTools, который имеет это свойство moc. Они получают доступ к этому свойству moc следующим образом:

// Assume: Inside an NSOperation or new thread here...
NSManagedObjectContext *moc = [[CoreDataTools sharedInstance] moc];

// Do a lot of things with moc. Add and remove 20 objects.

Будет ли это вообще эффективно? Я не понимаю, КОГДА этот замок эффективен. Просто в случае фактического доступа к собственности? Или я могу безопасно работать с экземпляром NSManagedObjectContext до тех пор, пока NSOperation или вызванный метод фонового потока не будет выполнен и не вернет?

Я знаю, что NSMangagedObjectContext имеет метод -lock. В общем, я хочу знать, сработает ли это или нет.

Ответы [ 2 ]

4 голосов
/ 01 июня 2011
 @synchronized(self) { /* lock is effective inside here only */ } 
2 голосов
/ 01 июня 2011

Нет.Каждый поток должен иметь свой собственный контекст управляемого объекта.

Дополнительная информация: параллелизм с базовыми данными

...