【发布时间】:2015-07-14 22:12:06
【问题描述】:
我的问题很简单。为什么不是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++ 实现中都是无锁的。
【问题讨论】:
-
我猜原因是大多数 CPU 不支持原子
double操作。那么你将如何实现呢? -
@Damon:标准不关心寄存器。 “可简单复制”就是使用 memcpy(简单地说)从一个内存位置复制到另一个内存位置。如果不支持该架构,那它一定很奇怪。
-
但无论如何,SSE2 是 64 位的基准,并且许多 32 位软件都是在启用 SSE2 的情况下构建的。在这种情况下,绝对没有什么奇怪的。无论哪种方式,
std::atomic<double>在 gcc/clang/msvc 上都是无锁的。 stackoverflow.com/questions/45055402/… -
@curiousguy:“平凡可复制”,而不是“可复制”是正确的拼写。我只提到这一点,以防您要编辑其他任何内容以进行相同的更改。您编辑的其余部分看起来很合理。 “interlocked”是在询问是否可以使用 x86 Windows 术语实现底层实现,这还不错,但可以肯定的是,对原子 RMW 的硬件支持是一回事。
-
@curiousguy:见docs.microsoft.com/en-us/windows/win32/api/winnt/…和朋友,喜欢
InterlockedXor64
标签: c++ floating-point atomic compare-and-swap stdatomic