У меня вопрос о безопасности потоков в Objective-C. Я прочитал пару других ответов, некоторые из документации Apple, и все еще есть некоторые сомнения в этом, поэтому подумал, что я задам свой вопрос.
Мой вопрос три раза:
Предположим, что у меня есть массив, NSMutableArray *myAwesomeArray;
Сложить 1:
Теперь исправьте меня, если я ошибаюсь, но из того, что я понимаю, использование @synchronized(myAwesomeArray){...}
предотвратит доступ двух потоков к одному и тому же блоку кода. Итак, в основном, если у меня есть что-то вроде:
-(void)doSomething {
@synchronized(myAwesomeArray) {
//some read/write operation on myAwesomeArray
}
}
тогда, если два потока обращаются к одному и тому же методу с тем же временем, этот блок кода будет потокобезопасным. Я предполагаю, что я правильно понял эту часть.
Сложить 2:
Что мне делать, если к myAwesomeArray
обращаются несколько потоков из разных методов?
Если у меня есть что-то вроде:
- (void)readFromArrayAccessedByThreadOne {
//thread 1 reads from myAwesomeArray
}
- (void)writeToArrayAccessedByThreadTwo {
//thread 2 writes to myAwesomeArray
}
Теперь оба метода получают доступ к двум различным потокам одновременно. Как я могу гарантировать, что myAwesomeArray
не будет иметь проблем? Использую ли я что-то вроде NSLock или NSRecursiveLock?
Сложить 3:
Теперь, в вышеупомянутых двух случаях, myAwesomeArray
был iVar в памяти. Что делать, если у меня есть файл базы данных, который я не всегда храню в памяти. Я создаю databaseManagerInstance
всякий раз, когда я хочу выполнять операции с базой данных, и отпустите его, как только закончите. Таким образом, в основном разные классы могут обращаться к базе данных. Каждый класс создает свой собственный экземпляр DatabaseManger
, но в основном все они используют один и тот же файл с одной базой данных. Как я могу гарантировать, что данные не будут повреждены из-за условий гонки в такой ситуации?
Это поможет мне понять некоторые из моих основ.