NSObjectの保持メソッドはアトミックですか?NSObjectの保持メソッドはアトミックですか?
たとえば、2つの異なるスレッドから同じオブジェクトを保持する場合、保持カウントが2回アップしたと約束されているか、保持カウントを1回増やすことは可能ですか?
ありがとうございました。
NSObjectの保持メソッドはアトミックですか?NSObjectの保持メソッドはアトミックですか?
たとえば、2つの異なるスレッドから同じオブジェクトを保持する場合、保持カウントが2回アップしたと約束されているか、保持カウントを1回増やすことは可能ですか?
ありがとうございました。
NSObject
オブジェクト割り当ておよび保持カウント関数はスレッドセーフです。Thread Programming GuideのAppendix A: Thread Safety Summaryを参照してください。
編集:私は、Core Foundationのオープンソースの部分を見てみることにしました。 CFRuntime.cでは、__CFDoExternRefOperation()
は、保持カウンタを更新する機能です。プロセスに複数のスレッドがあるかどうかをテストし、複数のスレッドがある場合は、保持カウントを更新する前にスピンロックを取得し、この操作をスレッドセーフにします。
興味深いことに、保持カウントは、struct
(クラス)の意味でのオブジェクトの属性(またはインスタンス変数)ではありません。ランタイムは、保持カウンタを持つ別の構造を保持します。実際に、私が正しく理解していれば、この構造はハッシュテーブルの配列であり、各ハッシュテーブルに対してスピンロックがあります。つまり、ロックは同じハッシュテーブルに配置された複数のオブジェクトを参照します。つまり、ロックはグローバル(すべてのインスタンス)でもインスタンスごとでもありません。
これは正しいです。グローバルロックの競合を減らすために、 "ロックストライピング"という戦略を使用します。これはまだかなり遅いので、refcountのチャーンが非常に多いオブジェクトがある場合は、カスタムのrefcountingシステムを実装する価値があります。特に難しいことではありませんが(OSAtomicIncrement()とfriendsを使用します)、これらのオブジェクトのRefcount履歴をInspectで検査する機能は失われます。 –