C++ 为什么不是';t原子双原子
我的问题很简单。为什么不是std::atomic?我知道这与原子RMW(读修改写)访问有关。但我真的不明白,为什么这不应该在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++
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++标准规定了基本积分类型的特殊性质。(即包含要求在语言中出现的整数的类型)。这些专业对原子的一般情况有进一步的要求,因为它们必须支持:
- 取加
- 取子
- 取回
- 取回
- 取异或
- 运算符++
- 接线员--
- 比较运算符和赋值运算符
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++标准建议()计划将fetch\u add
/fetch\u sub
。