为什么std::atomic对象不可复制

Why are std::atomic objects not copyable?

本文关键字:可复制 对象 atomic std 为什么      更新时间:2023-10-16

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

是否存在不能复制原子类型的技术原因?或者是为了避免一些糟糕的代码而故意限制接口?

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

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

  1. 技术原因:大多数原子类型不能保证是无锁的。原子类型的表示可能需要包含一个嵌入的互斥锁,而互斥锁是不可复制的。

  2. 逻辑推理:复制原子类型意味着什么?整个复制操作应该是原子式的吗?副本和原始的是否表示相同的原子对象?

对于跨越两个独立原子对象的操作,没有定义良好的含义,因此不值得这样做。您可以做的一件事是将从一个原子对象加载的值传输到另一个原子对象。但是,加载只与前一个对象上的其他操作直接同步,而存储与目标对象上的操作同步。每个部分都可以有完全独立的内存顺序约束。

将这样的操作明确地描述为加载和存储操作,而赋值操作则会让人想知道它与参与对象的内存访问属性有什么关系。如果坚持的话,可以通过组合std::atomic<..>的现有转换来实现类似的效果(需要显式强制转换或值类型的其他中介)。