バックグラウンドキュー内のこのmyID
オブジェクトとの対話を同期しようとしている場合は、逆の方法で、ディスパッチされたブロック内のロックが必要です。今あなたが持っている:あなたのキューに派遣ブロックを追加するプロセスを同期だが、はあなたがバックグラウンドでやっている同期しない
@synchronized(myID) {
dispatch_async(queue, ^{
// do stuff with myID
});
}
。私はそれがあなたが意味するものではないと思う。
おそらく意図:
dispatch_async(queue, ^{
@synchronized(myID) {
// do stuff with myID
}
});
をそれは非常に似ていますが、全く異なる動作が発生します。現在、バックグラウンド・キューにディスパッチされた作業は同期されています。さらなる改良として
、これはブロックはおそらく遅いです(と私はそれがかもしれ仮定)派遣なら、あなたはおそらくできるだけ多くの@synchronized
ブロック制約したいと思います:あなたの場合は
dispatch_async(queue, ^{
// do slow stuff in preparation for interacting with `myID`
@synchronized(myID) {
// quickly do stuff with myID
}
// do anything else here
});
を@synchronized
ブロック内のすべてのバックグラウンドブロックを実行すると、それをバックグラウンドにディスパッチする目的、つまりメインキューへの影響を最小限に抑えるために、すべての目的を無効にすることができます。この最後の演出は、その問題を緩和する。
最終的には、シリアル・キュー(またはバリアで更新を行う非グローバル・コンカレント・キュー)を使用している場合は、ロックの必要性を排除する技術としてよく使用されています。 myID
のすべての更新と照会がそのキューにディスパッチされます。 「並行処理プログラミングガイド」のEliminating Lock-Based Codeを参照してください。
出典
2013-09-05 01:37:36
Rob
達成しようとしていることは何ですか? – Wain
ところで、あなたは、いつでもmyIDを再インスタンス化していないと仮定して正しいですか? '@synchronized'ブロックは、一般的な変数ではなく、' myID'が指すオブジェクトのその特定のインスタンスに固有のものです。 – Rob