Objective-Cのスレッドセーフについて質問があります。私は他のいくつかの答え、いくつかのAppleのドキュメントを読みましたが、これに関してまだ疑問があるので、私自身の質問をしたいと思いました。
私の質問は3つあります:
配列があるとしましょう。NSMutableArray *myAwesomeArray;
折り1:
間違っている場合は訂正してください。ただし、私が理解していることから、を使用@synchronized(myAwesomeArray){...}
すると、2つのスレッドが同じコードブロックにアクセスできなくなります。したがって、基本的に、次のようなものがある場合:
-(void)doSomething {
@synchronized(myAwesomeArray) {
//some read/write operation on myAwesomeArray
}
}
次に、2つのスレッドが同時に同じメソッドにアクセスする場合、そのコードブロックはスレッドセーフになります。この部分はきちんと理解できたと思います。
折り2:
myAwesomeArray
異なるメソッドから複数のスレッドによってアクセスされている場合はどうすればよいですか?私が次のようなものを持っている場合:
- (void)readFromArrayAccessedByThreadOne {
//thread 1 reads from myAwesomeArray
}
- (void)writeToArrayAccessedByThreadTwo {
//thread 2 writes to myAwesomeArray
}
現在、両方のメソッドは2つの異なるスレッドによって同時にアクセスされます。問題がないことを確認するにはどうすればよいmyAwesomeArray
ですか?NSLockやNSRecursiveLockのようなものを使用しますか?
折り3:
さて、上記の2つのケースでmyAwesomeArray
は、メモリ内のiVarでした。データベースファイルがある場合、常にメモリに保持されるとは限りません。データベース操作を実行したいときはいつでも作成し、databaseManagerInstance
完了したら解放します。したがって、基本的に、さまざまなクラスがデータベースにアクセスできます。各クラスは独自のインスタンスを作成しますがDatabaseManger
、基本的には、すべて同じ単一のデータベースファイルを使用しています。このような状況で競合状態が原因でデータが破損しないようにするにはどうすればよいですか?
これは、私の基本のいくつかを明確にするのに役立ちます。