質問: x; ``` これ、volatileではダメなんでしょうか? **[疑問5]** 疑問2と似ているのですが・・・このメモリバリアと呼ばれるものはどうやって実現しているのでしょうか? これも、CPUにメモリバリア専用命令みたいなのが用意されているのでしょうか? メモリバリアの `atomic_thread_fence`の名前でatomicが付いているので、そうなのかなぁ〜〜という推測です。 疑問3と4は、アトミックとvolatileとメモリバリアの違いについての疑問です。 わかる方お願いします。 環境は、g++ Linux です。 **[追記]** 疑問3については、volatileが必要な場面を見つけ出すの中でChironianさんが触れていることに非常に近いですね。 > > なるほど。そう言えば、関数呼び出しを挟めば最適化が抑止されたことがありました。そのように規定されているのですね!(lock()が同期用のロックかどうかコンパイラは把握できない筈ですし) > > アトミック変数はどうでしょう? 必要に応じて暗黙的にvolatileになるのでしょうか? > > > アトミック変数がvolatileの性質を含んでいるような気がしますが・・・ 質問中のコードにはなぜvolatileが登場しているんでしょうかね・・・
回答: > > アトミックとミューテックスを併用したプログラミングスタイルというものも存在するのでしょうか? > > > Linux の pthread mutex と Windows のクリティカルセクションオブジェクト(EnterCriticalSection等で使用されるオブジェクト)は規定の回数はアトミックロックによりロックを確保(スピンロックとか呼ばれる)しようとして、アトミックロックに失敗した場合のみカーネルオブジェクトの mutex によりロックを確保します。 質問の回答としては OS レベルの API ではパフォーマンスのためにそのような実装になっているものがあるというところですかね。 解説サイトを探してみたらありましたね。 このサイトによると pthread mutex の スピンロックは Posix 非標準とのこと・・・。