私のCocoa/iOSアプリケーションには、静的double変数(これを呼びましょうfoo)があります。これは次のようにする必要があります。
- バックグラウンドスレッドでアプリの一部によって更新されました
- メインスレッドで私のアプリの別の部分によって読まれました
へのアクセスを同期するための最も軽量な方法を探していますfoo。
注:これらの場合の最も簡単な解決策は、通常、1つのスレッドのみが変数にアクセスするようにコードを調整することであり、したがって同期は必要ありません。fooこの場合、単一のスレッドへのアクセスを制限することは不可能であると私が判断したと仮定しましょう(おそらく、ステップ1で実行されるアクションが非常に迅速に発生するため、スレッドの切り替えは望ましくありません)。foo「 1つのスレッドへのアクセスを制限する」という回答で応答しないでください。私はそれに代わるものを探しています。
私の現在の理解では、volatile変数を使用することがへのアクセスを同期する最も軽量な方法fooです。したがってfoo、次のように宣言されます。
static volatile double foo = 60.0;
バックグラウンドスレッド書き込みコードは次のようなものです。
foo = 90.0;
メインスレッドの読み取りコードは次のようなものです。
double bar = 0.0;
bar = foo;
// use bar here …
いくつかの質問:
fooメインスレッドは、バックグラウンドスレッドに書き込まれた後の更新された値を確認することが保証されていますか(foo宣言されている場合volatile)?IOW、2つのスレッドが互いの読み取り/書き込み操作の結果を確認できるようにするために十分なことをしましたか?- この状況では、ブロックやのようなミューテックスロックよりも、値に使用
volatileする方が高速/軽量/好ましいと思います。本当?IOW、この特定のケースに最適なソリューションはありますか?double@synchronizedNSLockvolatile