web-dev-qa-db-ja.com

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

Herb Sutterothers から読んだことから、少なくともC /に関しては、volatileと並行プログラミングは完全に直交する概念であると思うでしょう。 C++が関係しています。

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

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

72
deft_code

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

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

関連する見積もりは

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

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

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

56
stephan

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

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

atomic<>が揮発性修飾関数を持っているのは、const修飾関数を持っているのと同じ理由です。なぜなら、原則として、オブジェクトが両方ともatomic<>およびconstおよび/またはvolatile

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

77
Herb Sutter

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;
};