C++ Atomic变量技术疑问:声明为原子变量后count是否始终为0?
你的C++ Atomic变量疑问解答
首先得补个关键前提:你没明确说明两个线程具体对count执行了什么操作,但从「未同步时最终可能是15」这个反直觉结果来看,应该是两个线程都在执行非原子的读写-修改-写回操作(比如多轮count++/count--,或者复合赋值逻辑)。咱们一步步拆解:
先搞懂为啥未同步会跑出15这种奇怪结果
举个贴近你场景的例子:假设两个线程同时执行这段代码:
// 线程1、线程2并行执行 for (int i = 0; i < 10; ++i) { count++; // 拆成三步:读count值→加1→写回内存,全程非原子 } for (int i = 0; i < 5; ++i) { count--; // 同理,也是三步非原子操作 }
按正常逻辑,每个线程给count净增加5,两个线程加起来应该是10对吧?但为啥会出现15?核心原因是非原子操作的中间状态会被其他线程干扰:比如线程1刚读完count=10准备做减1操作,线程2已经把count改成15了,线程1还傻乎乎写回9?或者反过来,增量操作的写回被多次覆盖后意外叠加——总之非原子操作下,多个线程的读写完全无秩序,结果完全不可控,出现任何数值都不奇怪。
换成Atomic变量后,结果会是啥?
当你把count声明为std::atomic<int>(或对应类型),count++、count--、count += n这类操作都会变成原子操作——简单说就是CPU会用特殊指令把「读-改-写」这三步打包成一个不可打断的整体,中间不会被其他线程插足。
那回到你的核心问题:**会不会始终为0?**这得看两个线程的操作逻辑是不是严格对称的「净变化为0」:
- 如果每个线程的操作是「加X,再减X」,那最终
count肯定是0——因为每一步原子操作都不会被干扰,总变化就是0+0=0; - 如果线程操作不是对称的(比如两个线程都是加10减5),那最终结果会是10,而不是0,但绝对不会出现15这种异常值——原子操作彻底杜绝了竞态导致的结果偏差。
额外提一句:Atomic变量只保证单个操作的原子性,如果你的线程逻辑是多个原子操作的组合(比如先读count值,再根据值做条件修改),那还是需要额外的同步手段,但这和你当前的场景无关。
内容的提问来源于stack exchange,提问作者snowrain
相关产品推荐
相关产品推荐

