2011-01-17 5 views
11

NSObjectの保持メソッドはアトミックですか?NSObjectの保持メソッドはアトミックですか?

たとえば、2つの異なるスレッドから同じオブジェクトを保持する場合、保持カウントが2回アップしたと約束されているか、保持カウントを1回増やすことは可能ですか?

ありがとうございました。

答えて

13

NSObjectオブジェクト割り当ておよび保持カウント関数はスレッドセーフです。Thread Programming GuideAppendix A: Thread Safety Summaryを参照してください。


編集:私は、Core Foundationのオープンソースの部分を見てみることにしました。 CFRuntime.cでは、__CFDoExternRefOperation()は、保持カウンタを更新する機能です。プロセスに複数のスレッドがあるかどうかをテストし、複数のスレッドがある場合は、保持カウントを更新する前にスピンロックを取得し、この操作をスレッドセーフにします。

興味深いことに、保持カウントは、struct(クラス)の意味でのオブジェクトの属性(またはインスタンス変数)ではありません。ランタイムは、保持カウンタを持つ別の構造を保持します。実際に、私が正しく理解していれば、この構造はハッシュテーブルの配列であり、各ハッシュテーブルに対してスピンロックがあります。つまり、ロックは同じハッシュテーブルに配置された複数のオブジェクトを参照します。つまり、ロックはグローバル(すべてのインスタンス)でもインスタンスごとでもありません。

+7

これは正しいです。グローバルロックの競合を減らすために、 "ロックストライピング"という戦略を使用します。これはまだかなり遅いので、refcountのチャーンが非常に多いオブジェクトがある場合は、カスタムのrefcountingシステムを実装する価値があります。特に難しいことではありませんが(OSAtomicIncrement()とfriendsを使用します)、これらのオブジェクトのRefcount履歴をInspectで検査する機能は失われます。 –

関連する問題