73

私がハーブサッターの人たちから読んだことからvolatile、少なくともC / C ++に関する限り、並行プログラミングは完全に直交する概念であると思うでしょう。

ただし、GCC実装では、のすべてstd::atomicのメンバー関数にvolatile修飾子があります。同じことがAnthonyWilliamsのの実装にも当てはまりますstd::atomic

では、どうしたのか、私のatomic<>変数は必要volatileかどうか?

4

3 に答える 3

80

他の人が正しく書いたことを要約すると:

C / C ++volatileは、ハードウェアアクセスと割り込み用です。C ++ 11atomic<>は、スレッド間通信用です(たとえば、ロックフリーコードで)。これらの2つの概念/使用法は直交していますが、要件が重複しているため、人々は2つを混同することがよくあります。

揮発性修飾関数を使用する理由atomic<>は、const修飾関数を使用する理由と同じです。これは、原則として、オブジェクトがatomic<>andconstおよび/またはの両方である可能性があるためvolatileです。

もちろん、私の記事が指摘したように、さらなる混乱の原因は、C / C ++volatileがC#/ Javaと同じではないということですvolatile(後者は基本的にC ++ 11と同等ですatomic<>)。

于 2010-03-19T17:54:50.283 に答える
58

volatile修飾子が全体で使用されるのはなぜstd::atomicですか?

そのため、揮発性オブジェクトもアトミックにすることができます。ここを参照してください:

関連する見積もりは

関数と操作は揮発性オブジェクトを処理するように定義されているため、揮発性である必要がある変数もアトミックにすることができます。ただし、原子性には揮発性修飾子は必要ありません。

私のatomic<>変数はそうである必要がありますvolatileか?

いいえ、アトミックオブジェクトは揮発性である必要はありません。

于 2010-03-19T17:12:35.973 に答える
15

constとして、volatileは推移的です。メソッドをとして宣言した場合volatile、そのメソッドまたはそのメンバー属性に対して不揮発性メソッドを呼び出すことはできません。std::atomicメソッドを持つことで、変数を含むクラスのメンバーメソッドvolatileからの呼び出しを許可します。volatilestd::atomic

私は良い一日を過ごしていません...とても混乱しています...多分少しの例が役立ちます:

struct element {
   void op1() volatile;
   void op2();
};
struct container {
   void foo() volatile {
      e.op1();  // correct
      //e.op2();  // compile time error
   }
   element e;
};
于 2010-03-19T17:25:36.453 に答える