思うだけで学ばない日記 2.0

思うだけで学ばない日記から移転しました☆!よろしくお願いします。

メモリバリアまとめ

Xbox 360 と Microsoft Windows でのロックレス プログラミングの考慮事項

Volatile 変数と順序変更
(中略)
Visual C++ 2005 には、volatile 変数へのアクセスに関して、標準の C++ を補うために、マルチスレッドを想定したセマンティクスが定義されています。Visual C++ 2005 以降では、volatile 変数からの読み取りには Read-Acquire セマンティクスが、volatile 変数への書き込みには Write-Release セマンティクスが適用されるように定義されています。つまり、コンパイラによって、読み取りと書き込みが、互いを飛び越えて移動されることはありません。さらに、Windows 上では、CPU による順序変更も確実に防ぐことができます。

つまりWindowsVC++ 2005以降を使う限り、ある構造体内容を別スレッドに渡す処理の完遂を保証するにあたり、高価なクリティカルセクションを使うような真似は要らないっぽい
ダミ────のvolatile変数を1個用意して何か書けば、当該スレッドにおいてその書き込み以前に発行された書き込みは、(volatile/非volatile問わず)全て他スレッドおよび他CPUコアに対して効力を持つ*1

実験してくれている人がいるから実験は省略(何
ttp://d.hatena.ne.jp/bsdhouse/20090720

さらに参考
ttp://ml.tietew.jp/cppll/cppll/article/11734

いじょ

追記

いややるべきことの真実は実は参考リンクの方に含まれているのかもしれない、

追記2

いや参考リンクではイントリンシック命令でフェンス命令を問答無用に実行しているが、これは効果がありすぐるために実はパフォーマンスと引き替えに支払うコスト的に最安値ではないかもしれない
一方「WindowsVC++ 2005以降を使う」場合は、

  • VC++ 2005以上のコンパイラが吐くコードで構成されるスレッドAとスレッドBの間でデータ転送のやりとりを破綻させないことが保証できる

という、より限定された意味でのフェンスなのだろうから、問答無用フェンス命令実行よりもパフォーマンスにおいてもしかしたら最適化の余地があるかもしれない
以下略

*1:例によって「いや知らんけど」。