スレッドセーフにしたいObjective-Cクラスを書いています。これを行うために、私は pthreads と a を使用していますpthread_rwlock
(使用はやり@synchronized
過ぎです。pthreads についてもう少し学びたいと思います)。メソッドで指定されたオブジェクトでロックが開始され、init
で破棄されdealloc
ます。ロックを操作するには 3 つの方法があります。readLock
、writeLock
、unlock
。これら 3 つのメソッドは、関連する pthread 関数を呼び出すだけで、現在のところ他には何もありません。
以下に 2 つのオブジェクト メソッドを示します。どちらも writeLock を必要とします。
-(void)addValue:(const void *)buffer
{
[self writeLock];
NSUInteger lastIndex = self.lastIndex;
[self setValue:buffer atIndex:(lastIndex == NSNotFound) ? 0 : lastIndex+1];
[self unlock];
}
-(void)setValue:(const void *)buffer atIndex:(NSUInteger)index
{
[self writeLock];
//do work here
[self unlock];
}
呼び出しsetAddValue:
は最初に書き込みロックを取得し、次に呼び出しsetValue:atIndex:
も書き込みロックを取得しようとします。ドキュメントには、これが発生した場合の動作は未定義であると記載されています。したがって、ロックを取得しようとする前に、スレッドがロックされているかどうかを確認するにはどうすればよいでしょうか?
(クリティカル セクションが別のロック要求をトリガーする呼び出しを行わないようにすることはできますが、それはコードの繰り返しを意味し、コードを DRY に保ちたいと考えています)。