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