25

似乎std::atomic类型不是可复制构造或可复制分配的。为什么?

是否存在无法复制原子类型的技术原因?或者是为了避免某种错误代码而故意限制接口?

4

2 回答 2

28

在没有原子指令(或所有整数大小都没有原子指令)的平台上,类型可能需要包含互斥体以提供原子性。互斥锁通常不可复制或移动。

为了为std::atomic<T>所有平台的所有专业化保持一致的接口,这些类型永远不可复制。

于 2013-03-06T14:36:29.170 回答
19
  1. 技术原因:大多数原子类型不能保证是无锁的。原子类型的表示可能需要包含嵌入式互斥锁,并且互斥锁不可复制。

  2. 逻辑原因:复制原子类型意味着什么?整个复制操作是否应该是原子的?副本和原件会代表同一个原子对象吗?

跨越两个单独的原子对象的操作没有明确定义的含义,这将使这变得有价值。您可以做的一件事是将加载的值从一个原子对象转移到另一个原子对象。但是加载只与前一个对象上的其他操作直接同步,而存储与目标对象上的操作同步。每个部分都可以带有完全独立的内存排序约束。

将这样的操作拼写为加载后跟存储使这一点变得明确,而赋值会让人们想知道它与参与对象的内存访问属性有何关系。如果你坚持,你可以通过组合现有的转换来达到类似的效果std::atomic<..>(需要显式转换或其他值类型的中间值)。

.

于 2013-03-06T15:05:17.240 回答