У меня есть вопрос относительно безопасности потоков в Objective-C. Я прочитал пару других ответов, часть документации Apple, и у меня все еще есть некоторые сомнения по этому поводу, поэтому я решил задать свой вопрос.
Мой вопрос трижды:
Предположим, у меня есть массив, NSMutableArray *myAwesomeArray;
Fold 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
, но в основном все они используют один и тот же файл базы данных. Как в такой ситуации гарантировать, что данные не будут повреждены из-за условий гонки?
Это поможет мне прояснить некоторые из моих основ.