73

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

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

那么有什么关系,我的atomic<>变量是否需要volatile

4

3 回答 3

80

总结其他人正确写的内容:

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

具有 volatile 限定函数的原因atomic<>与它具有 const 限定函数的原因相同,因为原则上一个对象可能是既atomic<>和也const和/或volatile

当然,正如我的文章所指出的,另一个令人困惑的原因是 C/C++volatile与 C#/Java 不同volatile(后者基本上等同于 C++11 atomic<>)。

于 2010-03-19T17:54:50.283 回答
58

为什么始终使用volatile限定符std::atomic

这样 volatile 对象也可以是原子的。见这里

相关报价是

函数和操作被定义为与 volatile 对象一起使用,因此应该是 volatile 的变量也可以是原子的。但是,原子性不需要 volatile 限定符。

我的atomic<>变量是否需要volatile

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

于 2010-03-19T17:12:35.973 回答
15

作为 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;
};
于 2010-03-19T17:25:36.453 回答