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<>).
ste*_*han 56
为什么在volatile整个过程中使用限定符std::atomic?
因此,易失性对象也可以是原子的.看到这里:
相关报价是
函数和操作被定义为与volatile对象一起使用,因此应该是volatile的变量也可以是原子的.但是,volatile的限定符不是原子性所必需的.
我的atomic<>变量需要volatile与否?
不,原子对象不必是易变的.
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)
| 归档时间: |
|
| 查看次数: |
7582 次 |
| 最近记录: |