私は、GCDキューを使用して、リソースへの同時アクセスが連続して行われるようにするいくつかのメソッドを備えたobjective-cクラスを持っています(これを行う標準的な方法)。
これらのメソッドの一部は、同じクラスの他のメソッドを呼び出す必要があります。したがって、ロック機構は再入可能である必要があります。これを行う標準的な方法はありますか?
最初は、これらのメソッドのそれぞれを使用してもらいました
dispatch_sync(my_queue, ^{
// Critical section
});
アクセスを同期します。ご存知のように、これらのメソッドの 1 つが別のそのようなメソッドを呼び出すと、dispatch_sync 呼び出しが他のブロックが実行されるまで現在の実行を停止するため、デッドロックが発生します。これは、キューでの実行が停止されるため実行できません。これを解決するために、たとえば次の方法を使用しました。
- (void) executeOnQueueSync:(dispatch_queue_t)queue : (void (^)(void))theBlock {
if (dispatch_get_current_queue() == queue) {
theBlock();
} else {
dispatch_sync(queue, theBlock);
}
}
そして、私の方法のそれぞれで、私は使用します
[self executeOnQueueSync:my_queue : ^{
// Critical section
}];
戻り値の型が異なるすべてのブロックに対して、別のメソッドを記述する必要があるため、このソリューションは好きではありません。さらに、この問題は私にとって非常に一般的なようであり、これに対するより優れた標準的な解決策が存在するはずです。