Sperren eines Objekts, auf das von mehreren Threads zugegriffen wird - Objective-C

Ich habe eine Frage bezüglich der thread-Sicherheit in Objective-C. ich habe gelesen, ein paar andere Antworten, die einige der Apple-Dokumentation, und haben noch einige Zweifel in Bezug auf diese, so dachte, ich würde Fragen, meine eigenen Fragen stellen.

Meine Frage ist drei Falten:

Angenommen ich habe ein array, NSMutableArray *myAwesomeArray;

Fach 1:

Nun korrigiert mich wenn ich mich Irre, aber von dem was ich verstehe, mit @synchronized(myAwesomeArray){...} wird verhindern, dass zwei threads greifen auf die gleiche code-block. Also, im Grunde, wenn ich so etwas wie:

-(void)doSomething {
    @synchronized(myAwesomeArray) {
        //some read/write operation on myAwesomeArray
    }
}

dann, wenn zwei threads den Zugriff auf die gleichen Methode, bei der die gleichen Zeit, dieser block von code thread-safe. Ich vermute, ich habe verstanden, dass dieses Teil richtig.

Fach 2:

Was mache ich, wenn myAwesomeArray wird für den Zugriff durch mehrere threads aus verschiedenen Methoden?
Wenn ich so etwas wie:

- (void)readFromArrayAccessedByThreadOne {
    //thread 1 reads from myAwesomeArray
}

- (void)writeToArrayAccessedByThreadTwo {
    //thread 2 writes to myAwesomeArray
}

Nun werden die beiden Methoden werden aufgerufen, indem zwei verschiedene threads zur gleichen Zeit. Wie kann ich sicherstellen, dass myAwesomeArray keine Probleme haben? Verwende ich so etwas wie NSLock oder NSRecursiveLock?

Fach 3:

Nun, in den beiden vorgenannten Fällen myAwesomeArray war ein iVar in Erinnerung. Was ist, wenn ich habe eine Datenbank-Datei, die ich nicht immer im Gedächtnis behalten. Ich erstelle ein databaseManagerInstance Wann immer ich will Datenbankoperationen ausführen, und geben Sie es, sobald ich fertig bin. Also, im Grunde, den verschiedenen Klassen auf die Datenbank zugreifen können. Jede Klasse erstellt eine eigene Instanz von DatabaseManger, aber im Grunde sind Sie alle mit der gleichen, einzigen Datenbank-Datei. Wie kann ich sicherstellen, dass die Daten nicht beschädigt sind aufgrund von race conditions in einer solchen situation?

Dies wird mir helfen, löschen Sie einige meiner Grundlagen.

Kommentar zu dem Problem
@synchronisieren verhindert, dass andere threads greifen auf die gleiche variable, die Sie gesperrt haben, nicht, dass bestimmte code-block. Kommentarautor: Richard J. Ross III
Ah. Ich sehe. Nun, ich denke, es war ein wenig mehr zu dem, was ich verstanden hatte über die @synchronisieren Richtlinie. Danke! 😀 Kommentarautor: codeBearer
@codeBearer, antwortete ich Ihre Frage unter stackoverflow.com/a/15393623/412916 Kinda. Kommentarautor: Jano

InformationsquelleAutor der Frage codeBearer | 2012-06-01

Schreibe einen Kommentar