このサイトにはvolatile
、アトミック/マルチスレッド アクセスに変数を使用できるかどうかを尋ねる質問がいくつかあります。たとえば、ここ、ここ、またはここを参照してください。
さて、C(++) 標準準拠の答えは明らかにnoです。
ただし、Windows および Visual C++ コンパイラでは、状況はそれほど明確ではないようです。
私は最近、 MSDNの公式ドキュメントに回答して引用しましたvolatile
マイクロソフト固有
volatile として宣言されたオブジェクトは (...)
- 揮発性オブジェクトへの書き込み (揮発性書き込み) にはリリース セマンティクスがあります。グローバルまたは静的オブジェクトへの参照? 命令シーケンスで揮発性オブジェクトへの書き込みが発生する前に、コンパイルされたバイナリで揮発性書き込みが発生する前に発生します。
- 揮発性オブジェクトの読み取り (揮発性読み取り) には、取得セマンティクスがあります。グローバルまたは静的オブジェクトへの参照 ? これは、命令シーケンスで揮発性メモリの読み取り後に発生するものであり、コンパイルされたバイナリでの揮発性読み取りの後に発生します。
これにより、揮発性オブジェクトをマルチスレッド アプリケーションでのメモリのロックと解放に使用できます。
[鉱山を強調]
さて、これを読むと、揮発性変数はstd::atomic
、今後の C++11 標準と同様に、MS コンパイラによって処理されるように思われます。
しかし、私の回答へのコメントで、ユーザーHans Passantは次のように書いています。
注: MSDN に示されている例はかなり怪しいように見えます。通常、atomic exchangeなしではロックを実装できないためです。(アレックスも指摘したように。)これはまだ疑問を残しています。この MSDN の記事に記載されている他の情報の有効性、特にhereおよびhereのようなユース ケースの妥当性に注意してください。)
さらに、The Interlocked* 関数のドキュメントがあり、特にvolatile(!?)InterlockedExchange
変数を取り、アトミックな読み取りと書き込みを行います。(SO に関する 1 つの質問 -- InterlockedExchange をいつ使用する必要がありますか? -- は、この機能が読み取り専用または書き込み専用のアトミック アクセスに必要かどうかについて正式に回答していないことに注意してください。)
さらに、volatile
上記のドキュメントは「グローバルまたは静的オブジェクト」を何らかの形でほのめかしており、「実際の」取得/解放セマンティクスがすべての値に適用されるべきだと私は考えていました。
質問に戻る
Windows では、Visual C++ (2005 - 2010) を使用して、(32bit? int?) 変数を宣言するvolatile
と、この変数へのアトミックな読み取りと書き込みが許可されますか?
私にとって特に重要なことは、プログラムが実行されるプロセッサやプラットフォームとは関係なく、これが Windows/ VC ++ で保持される (または保持されない) ことです。(つまり、それが WinXP/32bit であるか、Itanum2 で実行されている Windows 2008R2/64bit であるかは重要ですか?)
検証可能な情報、リンク、テストケースで回答をバックアップしてください!