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

def*_*ode 71 c++ atomic volatile c++11

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

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

那么什么是交易,我的atomic<>变量需要volatile与否?

Her*_*ter 77

总结其他人写的正确:

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

其原因atomic<>有volatile限定的功能是它具有const限定的功能,同样的原因,因为它可能在原则上的对象既atomic<>和也const和/或volatile.

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

  • 在Andrei的一些文章中,他真正做的是劫持(呃,我的意思是,"重用")volatile关键字作为类型系统中一个方便的大多数未使用的标签,他可以用作重载的钩子并获得其他效果,这有点令人困惑,因为没有这么说. (10认同)
  • 我将滥用你在这里询问你对Alexandrescu关于使用`volatile`标志在线程不安全代码上产生编译时错误的文章的意见(使用`volatile`实例来锁定使用接口和`const_cast`在获取互斥锁时删除volatile.在这种语言中为此目的添加类型限定符'threadsafe'或类似物是否有意义(我只是大声思考)文章在这里:http://www.drdobbs.com/cpp/184403766; jsessionid = OEWBPI10M2IQLQE1GHPCKHWATMY32JVN (2认同)

ste*_*han 56

为什么在volatile整个过程中使用限定符std::atomic

因此,易失性对象也可以是原子的.看到这里:

相关报价是

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

我的atomic<>变量需要volatile与否?

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

  • @MichaëlRoy:`volatile`操作只是订购了.其他`volatile`访问.`atomic <T>`release,acquire和seq_cst ops是按顺序排序的.普通的非原子变量,所以用*just*`volatile`滚动你自己的原子不能给你没有障碍的相同的acq/rel语义.`volatile atomic <T>`可能/将来会有用[当编译器利用as-if规则优化原子时](/sf/ask/3217227121/ -redundant-stdatomic-writes),例如,防止将"冗余"写入合并到进度计数器. (2认同)

Dav*_*eas 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;
};
Run Code Online (Sandbox Code Playgroud)