似乎std::atomic
类型不是可复制构造的或可复制的。
为什么呢?
是否存在无法复制原子类型的技术原因? 或者界面是否有限制以避免某种不良代码?
答案 0 :(得分:21)
在没有原子指令的平台上(或者没有所有整数大小的原子指令),类型可能需要包含一个互斥体来提供原子性。互斥体通常不可复制或移动。
为了在所有平台上为std::atomic<T>
的所有特化保留一致的界面,这些类型永远不会被复制。
答案 1 :(得分:15)
技术原因:大多数原子类型都不能保证无锁。原子类型的表示可能需要包含嵌入的互斥锁,并且互斥锁不可复制。
逻辑原因:复制原子类型意味着什么?整个复制操作是否应该是原子的?副本和原始代表相同的原子对象吗?
对于跨越两个单独的原子对象的操作没有明确的含义,这将使这个值得。您可以做的一件事是将从一个原子对象加载的值传递到另一个原子对象。但是,加载只与前一个对象上的其他操作直接同步,而存储与目标对象上的操作同步。并且每个部分都可以具有完全独立的内存排序约束。
将这样的操作拼写为加载后跟存储的操作使得显式,而赋值会让人想知道它与参与对象的内存访问属性的关系。如果你坚持,你可以通过组合std::atomic<..>
的现有转换(需要显式转换或值类型的其他中间转换)来实现类似的效果。
。