2010-03-19 69 views
69

从我读到的Herb Sutterothers中,你会认为volatile和并发编程是完全正交的概念,至少就C/C++而言。为什么通过std :: atomic使用volatile限定符?

但是,在GCC implementation中,所有std::atomic的成员函数都具有volatile限定符。 Anthony Williams的implementationstd::atomic也是如此。

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

+0

+1先生威廉姆斯是在这里,也许他可以出现并给出答案:) – AraK 2010-03-19 16:55:30

+1

我已经看到关于comp.std.C++的一个问题。请记住,在单个线程中读取和写入的volatile易失性存储器是按顺序完成的,并且volatile对象不能在其上调用任何非易失性成员函数(就像const一样)。但除此之外,我对C++中的线程毫无头绪。每次我尝试在标准中阅读它时,我开始放弃,无法掌握纯文本中的间接和逻辑数量xD – 2010-03-19 17:08:14

回答

55

为什么在std::atomic中使用volatile限定符?

因此,挥发性物体也可以是原子的。见here

相关的报价是

的功能和操作的定义与挥发物的工作,让变量应该是挥发性的也可以是原子。但是,挥发性限定符不是原子性所必需的。

难道我atomic<>变量必须volatile与否?

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

+0

注意:这与技术上与平台特定的http:// stackoverflow相同.com/questions/3708160/what-is-effect-of-interlockedincrement-argument-declared-as-volatile – Suma 2010-11-22 10:54:02

+0

volatile限定符用于防止重新排序。这就是它的作用。 – 2017-08-31 04:25:24

15

作为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; 
}; 
75

总结别人怎么正确书写:

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

atomic<>具有volatile限定功能的原因是它具有常量限定功能相同的理由,是因为它在原理上是可能的对象既atomic<>并且还const和/或volatile

当然,如我的文章指出的那样,混乱的另一个来源是,C/C++ volatile是不一样的C#/爪哇volatile(后者基本上等同于C++ 11 atomic<>)。

+2

我会滥用你在这里问你的意见关于Alexandrescu关于使用'volatile'标志在线程不安全的代码上产生编译时错误的一篇文章(使用'volatile'实例来锁定使用当获得互斥体时,该接口和'const_cast'去除易失性)。在语言中添加一个类型限定词'threadsafe'或类似的用于这个目的是否合理?(我只是想大声)文章在这里:http://www.drdobbs.com/cpp/184403766;jsessionid=OEWBPI10M2IQLQE1GHPCKHWATMY32JVN – 2010-03-22 10:27:58

+0

我已经添加它作为一个问题在这里:http://stackoverflow.com/questions/2491495 – 2010-03-22 10:55:51

+10

在一些安德烈的文章,他真的在做什么是 劫持(呃,我的意思是“重用”)挥发性关键字作为一个方便的 大部分未使用的标签在类型系统中,他可以用作钩子来重载和获得其他效果,这有点令人困惑,因为 它没有这么说。 – 2010-03-23 14:10:03

相关问题