マルチスレッド アクセサーの GCD ベースのパターンに移行するかどうかを検討しています。私は何年もの間、アクセサーでカスタムロックベースの同期を使用してきましたが、いくつかの情報 ( Intro to GCD ) を見つけて、GCD ベースのアプローチの長所があるようです。ここで対話を開始して、自分自身と他の人が決定を検討するのを助けることを望んでいます.
パターンは次のようになります。
- (id)something
{
__block id localSomething;
dispatch_sync(queue, ^{
localSomething = [something retain];
});
return [localSomething autorelease];
}
- (void)setSomething:(id)newSomething
{
dispatch_async(queue, ^{
if(newSomething != something)
{
[something release];
something = [newSomething retain];
[self updateSomethingCaches];
}
});
}
プロの側では、おそらく非ブロック書き込みアクセスの利点が得られます。ロックよりも低いオーバーヘッド (おそらく?); 重要なコード セクションから戻る前にロックを解除するのを忘れないための安全性。他?
短所: 例外処理が存在しないため、必要なすべてのブロックにこれをコーディングする必要があります。
このパターンは、マルチスレッド アクセサーを記述する方法として推奨される可能性がありますか?
この目的でディスパッチ キューを作成するための標準的な方法はありますか? 言い換えれば、粒度をトレードオフするためのベストプラクティスは? たとえば、ロックを使用すると、各アトリビュートをロックすると、オブジェクト全体をロックするよりも粒度が細かくなります。ディスパッチ キューでは、すべてのオブジェクトに対して 1 つのキューを作成するとパフォーマンスのボトルネックが生じると想像できましたが、オブジェクトごとのキューは適切でしょうか? 明らかに、答えは特定のアプリケーションに大きく依存しますが、アプローチの実現可能性を評価するのに役立つ既知のパフォーマンスのトレードオフがあります。
情報/洞察をいただければ幸いです。