从我读到的Herb Sutter和others中,你会认为volatile
和并发编程是完全正交的概念,至少就C/C++而言。为什么通过std :: atomic使用volatile限定符?
但是,在GCC implementation中,所有std::atomic
的成员函数都具有volatile
限定符。 Anthony Williams的implementation的std::atomic
也是如此。
那么,什么是交易,我的atomic<>
变量需要volatile
或不?
从我读到的Herb Sutter和others中,你会认为volatile
和并发编程是完全正交的概念,至少就C/C++而言。为什么通过std :: atomic使用volatile限定符?
但是,在GCC implementation中,所有std::atomic
的成员函数都具有volatile
限定符。 Anthony Williams的implementation的std::atomic
也是如此。
那么,什么是交易,我的atomic<>
变量需要volatile
或不?
为什么在std::atomic
中使用volatile
限定符?
因此,挥发性物体也可以是原子的。见here:
相关的报价是
的功能和操作的定义与挥发物的工作,让变量应该是挥发性的也可以是原子。但是,挥发性限定符不是原子性所必需的。
难道我atomic<>
变量必须volatile
与否?
不,原子对象不必是易失性的。
注意:这与技术上与平台特定的http:// stackoverflow相同.com/questions/3708160/what-is-effect-of-interlockedincrement-argument-declared-as-volatile – Suma 2010-11-22 10:54:02
volatile限定符用于防止重新排序。这就是它的作用。 – 2017-08-31 04:25:24
作为const,volatile是可传递的。如果你声明一个方法为volatile
,那么你不能调用它的任何非易失性方法或其任何成员属性。通过使用std::atomic
方法volatile
,您允许在包含std::atomic
变量的类中从volatile
成员方法调用。
我没有好日子......如此混乱...也许一个小例子帮助:
struct element {
void op1() volatile;
void op2();
};
struct container {
void foo() volatile {
e.op1(); // correct
//e.op2(); // compile time error
}
element e;
};
总结别人怎么正确书写:
C/C++ volatile
是硬件访问和中断。 C++ 11 atomic<>
用于线程间通信(例如,在无锁码中)。这两个概念/用途是正交的,但它们有重叠的要求,这就是为什么人们经常混淆这两者。
该atomic<>
具有volatile限定功能的原因是它具有常量限定功能相同的理由,是因为它在原理上是可能的对象既atomic<>
并且还const
和/或volatile
。
当然,如我的文章指出的那样,混乱的另一个来源是,C/C++ volatile
是不一样的C#/爪哇volatile
(后者基本上等同于C++ 11 atomic<>
)。
我会滥用你在这里问你的意见关于Alexandrescu关于使用'volatile'标志在线程不安全的代码上产生编译时错误的一篇文章(使用'volatile'实例来锁定使用当获得互斥体时,该接口和'const_cast'去除易失性)。在语言中添加一个类型限定词'threadsafe'或类似的用于这个目的是否合理?(我只是想大声)文章在这里:http://www.drdobbs.com/cpp/184403766;jsessionid=OEWBPI10M2IQLQE1GHPCKHWATMY32JVN – 2010-03-22 10:27:58
我已经添加它作为一个问题在这里:http://stackoverflow.com/questions/2491495 – 2010-03-22 10:55:51
在一些安德烈的文章,他真的在做什么是 劫持(呃,我的意思是“重用”)挥发性关键字作为一个方便的 大部分未使用的标签在类型系统中,他可以用作钩子来重载和获得其他效果,这有点令人困惑,因为 它没有这么说。 – 2010-03-23 14:10:03
+1先生威廉姆斯是在这里,也许他可以出现并给出答案:) – AraK 2010-03-19 16:55:30
我已经看到关于comp.std.C++的一个问题。请记住,在单个线程中读取和写入的volatile易失性存储器是按顺序完成的,并且volatile对象不能在其上调用任何非易失性成员函数(就像const一样)。但除此之外,我对C++中的线程毫无头绪。每次我尝试在标准中阅读它时,我开始放弃,无法掌握纯文本中的间接和逻辑数量xD – 2010-03-19 17:08:14