gpt4 book ai didi

c++ - 为什么原子双重没有完全实现

转载 作者:IT老高 更新时间:2023-10-28 21:56:30 25 4
gpt4 key购买 nike

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

指定任何trivially copyable可以使用类型。当然还有 double是其中之一。因此,C++11 需要可用于任何类类型的基本操作(加载、存储、CAS、交换等)。

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

一个 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 floating point or SSE/AVX vector load/store on x86_64对于可移植示例; atomic<double>和 float 在大多数 C++ 实现中是无锁的。

最佳答案

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

该标准规定算术运算(+、*、+=、& 等)仅提供给“整数类型”的原子,因此 std::atomic<double>不会定义任何这些操作。

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

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

关于c++ - 为什么原子双重没有完全实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30048533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com