Блокировка доступа к объекту несколькими потоками — Objective-C

У меня есть вопрос относительно безопасности потоков в 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, но в основном все они используют один и тот же файл базы данных. Как в такой ситуации гарантировать, что данные не будут повреждены из-за условий гонки?

Это поможет мне прояснить некоторые из моих основ.

36
задан ROMANIA_engineer 1 December 2017 в 08:58
поделиться