2016-08-28 4 views
-1

volatileキーワードで変数を宣言すると、スレッドセーフな状態になりますか、場合によってはInterlockedクラスまたはlockステートメントでアクセスする必要がありますか?アクセシビリティの揮発性変数

+0

'volatile'は何らかの最適化を妨げますhttps://msdn.microsoft.com/en-us/library/x13ttww7.aspx" ... volatile宣言されたフィールドは、コンパイラの最適化の対象にはなりません。シングルスレッド... "; 'volatile'は銀色の弾丸ではなく、あなたは" ...インターロックされたクラスまたはロックステートメントを使ってそれにアクセスする必要がある " –

答えて

2

volatileキーワードは、完全にmemory barrierを挿入するだけで、CPUパイプライン上のすべての読み書き可能命令が確実に実行されます。エンドユーザにとって、他のスレッドでの可視性は保証されます。なぜなら、書き込みが完了すると、結果はCPUのキャッシュ(および必要に応じてRAM)にプッシュされるからです。最近のインテルCPUでこのアプリを実行している間は、これに気を付けるべきではありません。明示的な指示を追加することなく、読み取りと書き込みの障壁を保証します。

一方、Interlockedは、指定されたメモリアドレスでCPUバスをロックし、変数に対してアトミック操作を実行できるため、同じメモリアドレスで他のCPUコアが他の読み書き操作を実行することはできません時間。これらのアトミック操作は、実際にはx86 CPUアーキテクチャーファミリーと呼ばれる命令です。そのため、限られた量の操作(追加、増分、減分、交換、比較交換)があります。

volatileInterlockedの両方がCPU機能に関連していますが、クリティカルセクション、スピンロック、ミューテックス、セマフォ、自動/手動リセットイベントなどの一般的な同期プリミティブがその上に構築されています。

関連する問題