原子类型能否赋值另一个原子变量?store跨对象操作是否原子?
关于C++原子类型store操作原子性的疑问解答
首先明确两个核心问题:
- 为什么
i1 = i2会报错?因为C++的原子类型默认禁用了拷贝赋值和拷贝构造函数,这是语法层面的限制,和操作是否原子无关。 i1.store(i2)的本质是什么?它并非一个单一的原子操作,而是拆成了两步独立的原子操作:- 原子地读取
i2的当前值(等价于隐式调用i2.load()); - 原子地将读取到的值写入
i1(这是store方法本身的原子操作)。
- 原子地读取
这意味着整个i1.store(i2)的过程不具备整体原子性——两步操作之间可能被其他线程打断。比如若有其他线程在读取i2和写入i1的间隙修改了i2的值,那么i1最终存储的将不是调用store时i2的原始值。
《C++ Concurrency in Action》中提到的“针对两个不同对象的单个操作无法是原子的”完全正确,因为没有硬件指令能直接原子完成跨两个对象的读写操作,所有涉及多对象的操作都只能拆分为多个单对象原子操作的组合,而组合后的整体不具备原子性。
内容的提问来源于stack exchange,提问作者x f
相关产品推荐
相关产品推荐

