2013-09-06 7 views
6

Androidでは、別のスレッドからプリミティブ型に安全にアクセスして修正できました。私はこれを使ってOpenGL描画ループとメインスレッドAndroid UIで変更されたユーザー設定との間でデータを共有しました。各設定をプリミティブ型に格納し、それぞれを他の値から独立させることで、ロックやsynchronizedキーワードを使用せずにこれらの変数をすべて変更することはスレッドセーフです。原子は実際に合成されたプリミティブのために何かを意味しますか?

これはObjective-Cでも当てはまりますか?変数に原子を配置すると、本質的に、Javaで同期メソッドを使用するのと同様に、合成ゲッターとセッターにロックが使用されることが読み取れます。私が読んだことは、この理由は、オブジェクトが別のスレッドによって読み込まれている間に部分的に変更されないということです。

しかし、Javaのように、部分的に変更されても安全なプリミティブ型ですか?そうであれば、スレッド間でデータを共有するために私の古いパラダイムをJavaから使うことができるようです。しかし原始的な、正しいキーワードのための原子のキーワードは無意味だろうか?

また、原子変数を使用するよりも堅牢で高速なソリューションは、オブジェクトが複数のスレッドからアクセスされている場合に使用する前にオブジェクトをコピーすることです。しかし、私はそれがどのように達成できるのか分かりません。非原型オブジェクトがコピー中に変更されてコピーを破損することはありませんか?

+1

スレッド安全性を確保するためにatomicで基本型を宣言しないのはなぜですか? – John

+0

[Atomic vs nonatomic properties]の複製があります。(0120-13753) – bbum

+0

@ user1256663非常に遅いと聞きましたが、 OpenGLアプリ。懸念をフレーミングする。 – Tenfour04

答えて

6

プリミティブ型がプリミティブ型への変更は、CとObjective-Cでアトミックであることが保証されていないため、部分的に変更されることから、安全であることが保証されていませんそこから継承する。 Cの唯一の保証はシーケンスポイントに関係し、2つのシーケンスポイント間の処理がアトミックであるという要件はありません。経験則として、各フル式はシーケンスポイントです。

実際には、プリミティブの変更は2段階のプロセスです。変更はレジスタ内で行われ、メモリに書き出されます。書き込み自体がアトミックではない可能性は非常に低いですが、それがいつ発生するのか、変更されるのかについての保証もありません。 volatileの資格を取得しても、シーケンスポイントに関してのみ保証が提供されます。

アップルは、同時アクション機構の実装のためにCPUが提供する特別なアトミック命令に直接マップするOSAtomic.hによって、アトミックアクションのいくつかのC関数を公開しています。重い手渡しのミューテックスよりも直接それらの1つを使うことも可能です。Objective-Cでは

一般的なパターンは、次のとおり

  • 不変オブジェクトと機能的変換 - がメモリ管理上の理由もあるが、それは、部分的に理由NSStringNSArray、等であるから具体的に別個NSMutableStringNSMutableArrayなどです;
  • コピーディスパッチキューは、コピーを変更するか、キューにコピーするか、別の場所に移動して変更するか、キューに戻って置き換えて置き換えることができます。
  • このような@synchronizeds、NSConditionLocks、または適切な他の明示的な同期メカニズム。

メインスレッド自体はシリアルディスパッチキューです。そのため、自分自身を制限すると、並行性の問題を完全に無視することができます。

-2

プリミティブ型を部分的に変更することはできませんが、それはプリミティブ型の一部です。あなたはそれを修正するか、修正しません。その意味では、スレッドセーフであると言います。

原始型の場合、アトミックキーワードが無意味になると言っても間違いありません。

誰かがすでにここにこれを刺しを取っ: Objective-c properties for primitive types

+1

プリミティブがキャッシュで整列されている限り、ほとんどのアーキテクチャ*で部分的に変更されたプリミティブ型*を「見る」ことはできません。 –

+1

プリミティブとアーキテクチャに依存します。たとえば、一部のARMアーキテクチャでは8バイトの倍精度を使用しますが、正式には4バイトのロードとストアではアトミック性を約束します。 –

3

アトミック合成された@propertiesは、部分的な同時更新の影響を受けません。アクセッサメソッドは、必要に応じてそのアーキテクチャでロックを使用します。

一般に、Cのプリミティブ型は、同時部分更新に関して安全であるとは限りません。

関連する問題