为什么通过std :: atomic使用volatile限定符?

从我从Herb Sutter和其他人那里读到的,你会认为volatile和并发编程是完全正交的概念,至少就C / C ++而言。

但是,在GCC实现中,所有std::atomic的成员函数都具有volatile限定符。 安东尼威廉斯执行std::atomic也是如此。

那么有什么好处呢,我的atomic<>变量需要volatile还是不变?


为什么在std::atomic使用volatile限定符?

所以挥发性物体也可以是原子的。 看这里:

相关报价是

函数和操作被定义为与易失性对象一起工作,所以应该是易失性的变量也可以是原子的。 但是,挥发性限定符不是原子性所必需的。

我的atomic<>变量需要volatile还是不变?

不,原子对象不必是易变的。


总结其他人的正确写法:

C / C ++ volatile用于硬件访问和中断。 C ++ 11 atomic<>用于线程间通信(例如,在无锁代码中)。 这两个概念/用途是正交的,但它们有重叠的要求,这就是为什么人们经常混淆这两者。

atomic<>具有volatile限定函数的原因与它具有const限定函数的原因相同,因为对于constatomic<>可能是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;
};
链接地址: http://www.djcxy.com/p/26935.html

上一篇: Why is the volatile qualifier used through out std::atomic?

下一篇: Why is volatile needed in C?