Blokowanie dostępu do obiektu przez wiele wątków - Objective-C
Mam pytanie dotyczące bezpieczeństwa nici w Objective-C. Przeczytałem kilka innych odpowiedzi, część dokumentacji Apple i wciąż mam pewne wątpliwości, więc pomyślałem, że zadam własne pytanie.
Moje pytanie brzmitrzykrotnie:
Przypuśćmy, że mam tablicę,NSMutableArray *myAwesomeArray;
Fold 1:
Teraz popraw mnie, jeśli się mylę, ale z tego co rozumiem, używając@synchronized(myAwesomeArray){...}
zapobiegnie dostępowi dwóch wątków do tego samego bloku kodu. Tak więc, jeśli mam coś takiego:
-(void)doSomething {
@synchronized(myAwesomeArray) {
//some read/write operation on myAwesomeArray
}
}
następnie, jeśli dwa wątki mają dostęp dopodobnie metoda napodobnie czas, ten blok kodu będzie bezpieczny dla wątków. Zgaduję, że dobrze zrozumiałem tę część.
Złóż 2:
Co mam zrobić, jeślimyAwesomeArray
jest dostępne dla wielu wątków z różnych metod? Jeśli mam coś takiego:
- (void)readFromArrayAccessedByThreadOne {
//thread 1 reads from myAwesomeArray
}
- (void)writeToArrayAccessedByThreadTwo {
//thread 2 writes to myAwesomeArray
}
Teraz obie metody są dostępne przez dwa różne wątki w tym samym czasie. Jak to zapewnićmyAwesomeArray
nie będziesz miał problemów? Czy używam czegoś takiego jak NSLock lub NSRecursiveLock?
Złóż 3:
Teraz w powyższych dwóch przypadkachmyAwesomeArray
był iVarem w pamięci. Co jeśli mam plik bazy danych, którego nie zawsze przechowuję w pamięci. TworzędatabaseManagerInstance
ilekroć chcę wykonać operacje na bazie danych i zwolnić, gdy skończę. Zatem zasadniczo różne klasy mogą uzyskać dostęp do bazy danych. Każda klasa tworzy własne wystąpienieDatabaseManger
, ale w zasadzie wszystkie używają tego samego, pojedynczego pliku bazy danych. Jak upewnić się, że dane nie są uszkodzone z powodu warunków wyścigu w takiej sytuacji?
Pomoże mi to wyjaśnić niektóre z moich podstaw.