为什么不完全实现原子双重

lau*_*svr 20 c++ floating-point atomic compare-and-swap stdatomic

我的问题很简单.为什么没有std::atomic<double> 完全实施?我知道它与互锁变量访问有关.但是我真的没有看到,为什么这不应该是双倍的.

它被指定可以使用任何普通的可复制类型.当然,双重是其中之一.所以基本操作应该没问题(设置,阅读等).但是,在整数上可能有一组额外的操作(fetch_add,++,+ =等).

双重与这些类型的差别很小.它是原生的,三维可复制的等等.为什么标准不包括这些类型的双重?

小智 17

std::atomic<double>支持你可以在程序中创建一个它,它将在C++ 11的规则下工作.您可以使用它执行加载和存储,并进行比较交换等.

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

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

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

  • 顺便说一句,看起来std :: atomic <Floating>现在(C++ 20)需要对`fetch_add` /`fetch_sub`有一些支持. (3认同)

Ric*_*ges 9

标准库要求std::atomic<T>T是任何TriviallyCopyable类型.既然doubleTriviallyCopyable,std::atomic<double>应该编译和工作完美.

如果没有,则表示库有问题.

例如:http://goo.gl/QhaphY

编辑:自评论澄清问题:

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

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

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

当然,没有什么可以阻止图书馆维护者在不太可能发生的情况下提供这种专业化,即给定的体系结构支持原子排他性或两个双打(它永远不会!).

  • 原子AND与fabs()有关(清除符号位)。XOR / OR还可以有效地使符号位混乱。有趣的事实:C ++标准提案(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0020r5.html)计划将“ fetch_add”添加到原子浮点类型,因为显然某些硬件有效地支持了它。另请参阅[x86_64上的原子双浮点或SSE / AVX向量加载/存储](/sf/ask/3153878171/ -on-x86-64)的asm观点,以及一些效率低下的编译器输出:( (2认同)