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

问题描述 投票:19回答:2

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

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

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

c++ c++11 concurrency atomic interlocked
2个回答
17
投票

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

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

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

(编辑)。另外,VS2015RC中的std::atomic<double>是无锁的。


9
投票

标准库要求std::atomic<T>,其中T是任何TriviallyCopyable类型。由于doubleTriviallyCopyablestd::atomic<double>应该编译并且工作得非常好。

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

编辑:自评论澄清问题:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.