根据我从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;
};