最終更新:2015-04-25 (土) 09:16:18 (1522d)  

atomic はてなブックマークを見る
Top / atomic

C++

Objective-C@property

  • 異なるスレッドからいくつか同時に呼び出したとしても、完全な形で値を取得/設定できる代わりにレスポンスが遅くなる。
  • strongcopyretainのいずれかを指定し、nonatomicを指定しない場合、参照カウント環境では、オブジェクトプロパティ用に合成されたgetterアクセサは、ロックを使用し、戻り値の保持と自動解放を行います。その実装は、次のようになります。
    [_internal lock]; // オブジェクトレベルのロックを使用してロックする
    id result = [[value retain] autorelease];
    [_internal unlock];
    return result;

メモ

  • デフォルトでは、合成されるアクセサはすべてアトミックです。これは、マルチスレッド環境でプロパティへの堅牢なアクセスを可能にすることを意図しています。つまり、getterから返される値やsetterを通じて設定される値は、ほかのスレッドが同時に実行しているかどうかに関係なく必ず完全に取得または設定されます。

注意

  • プロパティのアトミック性は、スレッドセーフであるかどうかとは別の概念です。
  • あるスレッドが、アトミックなアクセサを使って、XYZPersonオブジェクトの姓と名前を変更する、という状況を考えてみましょう。
  • 同時に別のスレッドが姓と名前を取得しようとすれば、アトミックなゲッタは(クラッシュすることなく)完全な文字列を返しますが、それが正しい組み合わせである保証はありません。
  • 変更前に姓にアクセスし、変更後に名前にアクセスすると、正しく対応していない氏名が得られることになるのです。

関連

  • nonatomic - オブジェクト用に合成されたアクセサは、単に値を直接返すだけです。