【问题标题】:Is atomic variable in C++ implemented using volatile and CAS?C++ 中的原子变量是否使用 volatile 和 CAS 实现?
【发布时间】:2021-10-23 15:30:30
【问题描述】:

AtomicInteger 在 Java 中是使用 volatile 和 CAS 机制实现的。 source code

但是,C++11 是如何实现原子的呢?

【问题讨论】:

  • Java 中原子类型的实现不是用 Java 编写的——它基于 JVM 中发生的事情(解释字节码,并在主机系统上采取行动)。同样,在 C++ 中,原子类型的实现取决于实现(即编译器和标准库如何为目标机器做事的细节)。

标签: c++ c++11 concurrency atomic volatile


【解决方案1】:

std::atomic 是 C++ 语言的一部分;在支持原子指令的 ISA 上,它直接转换为这些指令。例如,在 x86 上,LOCK 前缀可用于加载和存储,还有 LOCK CMPXCHG(“CAS”指令)。

除了 CPU 指令,std::atomic 影响程序的内存顺序语义。更多详情请参阅C++ atomics and memory orderingC++ memory model

在缺少原子指令的 ISA 上,允许编译器使用辅助例程/锁来实现它,在这种情况下,is_lock_free() 可能会返回 false(这不太可能发生在原始类型中,因为所有 SMP 系统本身都支持原子操作)。

【讨论】:

    【解决方案2】:

    如果可能,std::atomic 将使用本机汇编级指令,该指令将以原子方式分配一个值。如果不可能(无论是因为您使用的是非本机数据类型还是因为 cpu 不支持这样的指令),它将默认使用 std::lock 以确保访问它是安全的(所以实际上不是那时是原子的)

    【讨论】:

      【解决方案3】:

      volatile 在 C++ 中的含义与在 Java 中不同,在 C++ 中它并不意味着内存排序。

      原子是使用编译器扩展(内在/内置函数)实现的。

      【讨论】:

        【解决方案4】:

        我在atomic header source 中发现了一些重定向到this page 的内容。然后你会看到带有Implementation 的索引,在它和许多其他的东西下面,有Integers

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-25
          • 1970-01-01
          • 2014-03-12
          • 1970-01-01
          • 2015-08-06
          • 1970-01-01
          • 2011-06-23
          • 2012-10-03
          相关资源
          最近更新 更多