C++ 为什么不是';t原子双原子

C++ 为什么不是';t原子双原子,c++,floating-point,atomic,compare-and-swap,stdatomic,C++,Floating Point,Atomic,Compare And Swap,Stdatomic,我的问题很简单。为什么不是std::atomic?我知道这与原子RMW(读修改写)访问有关。但我真的不明白,为什么这不应该在double上实现 它规定了任何类型都可以使用。当然,double就是其中之一。因此,C++11需要基本操作(加载、存储、CAS、交换等),您可以将这些操作用于任何类类型 但是,在整数上可以执行一组额外的操作(fetch\u add,++,+=,等等) double与这些类型几乎没有区别。它是本地的,可复制的,等等。为什么标准中没有包含这些类型的double 更新:C++

我的问题很简单。为什么不是std::atomic?我知道这与原子RMW(读修改写)访问有关。但我真的不明白,为什么这不应该在
double
上实现

它规定了任何类型都可以使用。当然,
double
就是其中之一。因此,C++11需要基本操作(加载、存储、CAS、交换等),您可以将这些操作用于任何类类型

但是,在整数上可以执行一组额外的操作(
fetch\u add
++
+=
,等等)

double
与这些类型几乎没有区别。它是本地的,可复制的,等等。为什么标准中没有包含这些类型的
double


更新:C++20对浮点类型专门化了
std::atomic
,使用fetch_add和sub,但不使用原子绝对值(and)或否定(XOR)


编者按:没有C++20,您可以从CAS中推出自己的产品;有关可移植示例,请参见<在大多数C++实现中,代码>原子< /代码>和浮动是无锁的。

< p>标准库命令<代码> STD::原子< /代码>,其中T是任何<代码>三个可复制的< /C> >类型。由于
double
literalycopyable
std::atomic
应该可以很好地编译和工作

如果没有,则表示您的库有故障

编辑:自澄清问题的评论起:

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

  • 取加
  • 取子
  • 取回
  • 取回
  • 取异或
  • 运算符++
  • 接线员--
  • 比较运算符和赋值运算符
或者,XOR,AND当然与浮点类型无关,甚至比较也开始变得棘手(因为需要处理epsilon)。因此,在没有支持需求的情况下,要求图书馆维护人员提供特定的专业知识似乎是不合理的

当然,没有什么可以阻止库维护人员在一个给定的体系结构支持两个双原子的原子异或(它永远不会!).

支持std::atomic,因为您可以在程序中创建一个,并且它将在C++11的规则下工作。您可以使用它执行加载和存储,并比较exchange等

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

我的理解是,因为在今天使用的硬件中对浮点类型或其他浮点类型的任何其他原子算术运算的支持很少,C++标准不提供它们的运算符,因为它们必须低效地执行。p>


(编辑)。另一方面,VS2015RC中的
std::atomic
是无锁的。

我猜原因是大多数CPU不支持原子
操作。那么你将如何实现它?@Damon:标准不关心寄存器。“普通可复制”就是使用memcpy(简而言之)从一个内存位置复制到另一个内存位置。如果不支持的话,架构会非常奇怪。但是无论如何,SSE2是64位的基线,很多32位软件都是在启用SSE2的情况下构建的。在这种情况下,绝对没有什么奇怪之处。无论哪种方式,
std::atomic
在gcc/clang/msvc上都是无锁的@奇怪的家伙:“平凡可复制”,而不是“可复制”是正确的拼写。我只是在你打算编辑任何其他内容以进行相同更改的情况下才提到这一点。剩下的编辑看起来很合理。“interlocked”询问使用x86 Windows术语的底层实现是否可行,这是一种不错的说法,但可以肯定的是,硬件对原子RMW的支持是一样的。@curiousguy:see和朋友们,比如
InterlockedXor64
我应该更清楚一些。我将把我的问题扩大一点。但在问题中我链接到的页面上。列出的许多类型都具有std::atomic的完整专门化。Double不在这些.Atomic中,它与
fabs()
(清除符号位)相关。XOR/OR也可以有效地处理符号位。有趣的事实:一个C++标准建议()计划将 FutChyAddio//C>添加到原子浮点类型,因为显然一些硬件支持它。另请参阅asm透视图和一些低效的编译器输出:(很有趣。感谢@petercordest上面的链接已被删除dead@phuclv是的,我明白了。我将删除它。顺便说一句,现在需要std::atomic(C++20)来支持
fetch\u add
/
fetch\u sub