为什么std::atomic对象不可复制
Why are std::atomic objects not copyable?
似乎std::atomic
类型是不可复制构造的或不可复制赋值的。为什么?
是否存在不能复制原子类型的技术原因?或者是为了避免一些糟糕的代码而故意限制接口?
在没有原子指令(或没有所有整数大小的原子指令)的平台上,类型可能需要包含一个互斥锁来提供原子性。互斥锁通常不可复制或移动。
为了在所有平台上为std::atomic<T>
的所有专门化保持一致的接口,这些类型永远不可复制。
-
技术原因:大多数原子类型不能保证是无锁的。原子类型的表示可能需要包含一个嵌入的互斥锁,而互斥锁是不可复制的。
-
逻辑推理:复制原子类型意味着什么?整个复制操作应该是原子式的吗?副本和原始的是否表示相同的原子对象?
对于跨越两个独立原子对象的操作,没有定义良好的含义,因此不值得这样做。您可以做的一件事是将从一个原子对象加载的值传输到另一个原子对象。但是,加载只与前一个对象上的其他操作直接同步,而存储与目标对象上的操作同步。每个部分都可以有完全独立的内存顺序约束。
将这样的操作明确地描述为加载和存储操作,而赋值操作则会让人想知道它与参与对象的内存访问属性有什么关系。如果坚持的话,可以通过组合std::atomic<..>
的现有转换来实现类似的效果(需要显式强制转换或值类型的其他中介)。
。
相关文章:
- C++17 如何保存泛型可调用对象以供以后使用
- 将包含不可复制对象的对插入到映射中
- 通用参考 l 值不复制对象
- 简单可复制与可简单复制
- 可变参数宏:无法通过"..."传递非平凡可复制类型的对象
- C :对象上的可复制视图
- 提升::可选与标准::不可复制对象的可选
- 错误:无法通过'...'传递非平凡可复制类型的对象'class boost::filesystem::path'
- 使用realloc可以安全地重新分配琐碎的可复制对象的存储吗
- 传递可选对象而无需复制它
- "constructing"一个带有memcpy的可复制对象
- 错误:无法通过`..`传递非普通可复制类型的对象
- 如何初始化非默认可构造不可复制对象的元组
- C++11/VS2010:返回包含不可复制但可移动对象的容器
- 无法传递非普通可复制类型“const class mysqlpp::String”的对象
- 将std::memcpy用于非平凡可复制类型的对象
- 如何返回一个不可移动(但可复制)的对象
- 正在复制通常在c++ 14中定义的可复制对象
- std::vector emplace_back() 表示非复制可构造对象
- 作用于可移动但不可复制对象序列的变化STL算法的行为