Herb Sutter と others から読んだことから、少なくともC /に関しては、volatile
と並行プログラミングは完全に直交する概念であると思うでしょう。 C++が関係しています。
ただし、GCCでは 実装std::atomic
のすべてのメンバー関数にはvolatile
修飾子があります。同じことがAnthonyWilliamsの implementation of std::atomic
にも当てはまります。
では、どうしたのか、私のatomic<>
変数はvolatile
である必要がありますか?
std::atomic
全体でvolatile
修飾子が使用されるのはなぜですか?
そのため、揮発性オブジェクトもアトミックにすることができます。 ここ を参照してください:
関連する見積もりは
関数と操作は揮発性オブジェクトを処理するように定義されているため、揮発性である必要がある変数もアトミックにすることができます。ただし、揮発性修飾子は原子性には必要ありません。
atomic<>
変数はvolatile
である必要がありますか?
いいえ、アトミックオブジェクトは揮発性である必要はありません。
他の人が正しく書いたことを要約すると:
C/C++ volatile
は、ハードウェアアクセスと割り込み用です。 C++ 11 atomic<>
はスレッド間通信用です(ロックフリーコードなど)。これらの2つの概念/使用法は直交していますが、要件が重複しているため、人々は2つを混同することがよくあります。
atomic<>
が揮発性修飾関数を持っているのは、const修飾関数を持っているのと同じ理由です。なぜなら、原則として、オブジェクトが両方ともatomic<>
およびconst
および/またはvolatile
。
もちろん、私の記事が指摘したように、さらなる混乱の原因は、C/C++ volatile
がC#/ Java volatile
と同じではないことです(後者は基本的にC++と同等です) 11 atomic<>
)。
Constとして、volatileは推移的です。メソッドをvolatile
として宣言した場合、そのメソッドまたはそのメンバー属性に対して不揮発性メソッドを呼び出すことはできません。 std::atomic
メソッドをvolatile
にすることで、std::atomic
変数を含むクラスのvolatile
メンバーメソッドからの呼び出しを許可します。
私は良い一日を過ごしていません...とても混乱しています...多分少しの例が役立ちます:
struct element {
void op1() volatile;
void op2();
};
struct container {
void foo() volatile {
e.op1(); // correct
//e.op2(); // compile time error
}
element e;
};