代码之家  ›  专栏  ›  技术社区  ›  deft_code

为什么挥发性限定符通过STD::原子?

  •  71
  • deft_code  · 技术社区  · 16 年前

    从我读到的 Herb Sutter others 你会认为 volatile 并发编程是完全正交的概念,至少就C/C++而言。

    但是,在GCC中 implementation 所有的 std::atomic 的成员函数具有 不稳定的 限定符。安东尼·威廉姆斯也是如此 implementation 属于 STD:原子 .

    那怎么办,做我的 atomic<> 变量必须是 不稳定的 或不是?

    3 回复  |  直到 9 年前
        1
  •  56
  •   stephan    9 年前

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

    所以挥发性物质也可以是原子的。见 here :

    相关报价如下

    函数和操作被定义为与易失性对象一起工作,因此应该易失性的变量也可以是原子的。然而,原子性不需要volatile限定符。

    做我的 atomic<> 变量必须是 不稳定的 或不是?

    不,原子物体不一定是易挥发的。

        2
  •  77
  •   KayEss    11 年前

    总结其他人正确书写的内容:

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

    原因是 原子<> 具有volatile限定函数的原因与它具有const限定函数的原因相同,因为一个对象原则上可能同时具有 原子<> 而且 const 和/或 不稳定的 .

    当然,正如我的文章指出的那样,混淆的另一个来源是C/C++。 不稳定的 和C /爪哇不一样 不稳定的 (后者基本上等同于C++ 11)。 原子<> )

        3
  •  15
  •   David Rodríguez - dribeas    16 年前

    作为const,volatile是可传递的。如果将方法声明为 volatile 然后不能对其或其任何成员属性调用任何非易失性方法。通过拥有 std::atomic 方法 不稳定的 你允许来自 不稳定的 类中包含 STD:原子 变量。

    我今天过得不好…如此混乱…也许一个小小的例子会有帮助:

    struct element {
       void op1() volatile;
       void op2();
    };
    struct container {
       void foo() volatile {
          e.op1();  // correct
          //e.op2();  // compile time error
       }
       element e;
    };