为什么在整个 std: : atom 中都使用易失性限定符?

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

然而,在 GCC实施中,所有 std::atomic的成员函数都有 volatile限定符。安东尼 · 威廉姆斯(Anthony Williams)的 实施 of std::atomic也是如此。

那么,我的 atomic<>变量需不需要是 volatile呢?

8074 次浏览

为什么整个 std::atomic使用 volatile限定词?

因此,易挥发的物体也可以是原子的。参见 给你:

相关报价是

函数和操作的定义是为了处理易失性对象,因此应该是易失性的变量也可以是原子的。但是,原子性并不需要易失性限定符。

我的 atomic<>变量是否需要是 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<>具有易失性限定函数的原因与它具有常量限定函数的原因相同,因为原则上一个对象既可以是 atomic<>,也可以是 const和/或 volatile

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