为什么 atomic double 没有完全实现

Why isn't atomic double fully implemented

我的问题很简单。为什么不是 std::atomic<double> implemented completely?我知道它与原子 RMW(读-修改-写)访问有关。但我真的不明白,为什么这在 double.

上是不可能的

指定可以使用任何trivially copyable类型。当然 double 也在其中。所以 C++11 需要可以与任何 class 类型一起使用的基本操作(加载、存储、CAS、交换等)。

但是,在整数上可以进行一组额外的操作(fetch_add+++= 等)。

A double 与这些类型差别很小。它是原生的,可简单复制等。为什么标准不包含这些类型的 double


更新:C++20 确实专门针对浮点类型 std::atomic<T>,使用 fetch_add 和 sub。 C++20 std::atomic<float>- std::atomic<double>.specializations 但不是原子绝对值 (AND) 或取反 (XOR)。

编者注:如果没有 C++20,您可以推出自己的 CAS;有关可移植示例,请参阅 atomic<double> 和 float 在大多数 C++ 实现中都是无锁的。

标准库要求 std::atomic<T>,其中 T 是任何 TriviallyCopyable 类型。由于 doubleTriviallyCopyablestd::atomic<double> 应该可以很好地编译和工作。

如果没有,则说明库有问题。

编辑:因为评论澄清了问题:

c++ 标准指定了基本整数类型的特定专业化。 (即包含需要在语言中出现的整数的类型)。这些特化对原子的一般情况有进一步的要求,因为它们必须支持:

  • fetch_add
  • fetch_sub
  • fetch_and
  • fetch_or
  • fetch_xor
  • 运算符++
  • 运营商--
  • 比较和赋值运算符

OR、XOR 和 AND 当然与浮点类型无关,甚至比较也开始变得棘手(因为需要处理 epsilon)。因此,强制 图书馆维护者在没有案例支持需求的情况下提供特定的专业化似乎是不合理的。

当然没有什么可以阻止库维护者在给定体系结构支持两个双精度的原子异或的不太可能的情况下提供这种专业化(它永远不会!).

std::atomic<double> 在某种意义上得到支持,您可以在您的程序中创建一个并且它将在 C++11 的规则下工作。您可以用它执行加载和存储,并进行比较交换等。

标准指定算术运算(+、*、+=、& 等)仅提供给 "integral types" 的原子,因此 std::atomic<double> 不会有任何这些定义的操作。

我的理解是,由于在当今使用的硬件中几乎不支持 fetch-add 或任何其他浮点类型的原子算术运算,因此 C++ 标准不为它们提供运算符,因为它们有执行效率低下。

(编辑)。顺便说一句,VS2015RC 中的 std::atomic<double> 是无锁的。