根据我从Herb Sutter和其他人那里读到的内容,您会认为volatile并发编程是完全正交的概念,至少就 C/C++ 而言。
但是,在 GCC实现中,所有std::atomic的成员函数都有volatile限定符。Anthony Williams的std::atomic.
那么有什么关系,我的atomic<>变量是否需要volatile?
总结其他人正确写的内容:
C/C++volatile用于硬件访问和中断。C++11atomic<>用于线程间通信(例如,在无锁代码中)。这两个概念/用途是正交的,但它们有重叠的要求,这就是人们经常混淆这两者的原因。
具有 volatile 限定函数的原因atomic<>与它具有 const 限定函数的原因相同,因为原则上一个对象可能是既atomic<>和也const和/或volatile。
当然,正如我的文章所指出的,另一个令人困惑的原因是 C/C++volatile与 C#/Java 不同volatile(后者基本上等同于 C++11 atomic<>)。
为什么始终使用volatile限定符std::atomic?
这样 volatile 对象也可以是原子的。见这里:
相关报价是
函数和操作被定义为与 volatile 对象一起使用,因此应该是 volatile 的变量也可以是原子的。但是,原子性不需要 volatile 限定符。
我的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;
};