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

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

但是,在GCC 实现中,所有std::atomic的成员函数都有volatile限定符。 Anthony Williams在std::atomic的实现中也是如此。

那么有什么事情,我的atomic<>variables需要volatile或不?

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

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

相关的报价是

函数和操作被定义为与易失性对象一起工作,所以应该是易失性的variables也可以是primefaces的。 但是,volatile限定符不是primefaces性所必需的。

我的atomic<>variables是否需要volatile或不?

不,primefaces对象不必是易变的。

总结别人的正确写法:

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

atomic<>具有volatile限定函数的原因与它具有const限定函数的原因是相同的,因为对于原型来说, atomic<>可能既是atomic<> ,也是const和/或volatile

当然,正如我的文章指出的那样,另外一个混淆之处是C / C ++ volatile与C#/ Java volatile (后者基本上等同于C ++ 11 atomic<> )是不一样的。

作为const,volatile是可传递的。 如果你声明一个方法为volatile那么你不能调用任何非易失性方法或其任何成员属性。 通过让std::atomic方法volatile你可以在包含std::atomicvariables的类中调用volatile成员方法。

我没有一个愉快的一天…很混乱…也许有一个例子可以帮助:

 struct element { void op1() volatile; void op2(); }; struct container { void foo() volatile { e.op1(); // correct //e.op2(); // compile time error } element e; };