Visual C++ 2005以降のvolatileのMS拡張
さらにvolatileについて、Microsoft独自拡張がなされてる記載を見つけました。
VisualStudio使って、Windowsアプリケーションを作る上ではこのルールだけでやっていけるのかもしれません。
Visual C++ 2005 には、volatile 変数へのアクセスに関して、標準の C++ を補うために、マルチスレッドを想定したセマンティクスが定義されています。Visual C++ 2005 以降では、volatile 変数からの読み取りには Read-Acquire セマンティクスが、volatile 変数への書き込みには Write-Release セマンティクスが適用されるように定義されています。つまり、コンパイラによって、読み取りと書き込みが、互いを飛び越えて移動されることはありません。 さらに、Windows 上では、CPU による順序変更も確実に防ぐことができます。
これを見ると、2005以降のコンパイラで volatile付き変数を読み書きするタイミングで Read-AcquireやWrite-Releaseが適用されるみたいです。現在のvolatile変数だけでうまくいってる例も、実はこの拡張に依存してるのでは?と思った次第です。
あともう1つ。PowerPCのアーキテクチャでは x86/x64のときとは違って大胆にメモリの読み書き順序が異なって見えます。これに対してどのように対処すればいいのか不思議に思っていましたが、InterlockedXXXAcquire/Releaseの命令を通常版の代わりに使えば、きちんと各種メモリバリアを張ってくれるようです。
参考文献
Microsoft – Xbox 360 と Microsoft Windows でのロックレス プログラミングの考慮事項
コメント