输出结果:Counter = 105516 每次不一样
原因分析:
Counter++ 看似是 “一步操作”,实际拆解为 3 个步骤:
1.读取Counter的当前值到寄存器;
2.寄存器值 + 1;
3.把新值写回Counter。
多线程执行时,可能出现 “线程 A 读值后,线程 B 抢先修改并写回,线程 A 再写回旧值 + 1” 的情况,导致计数丢失。
C++ 原子操作使用及源码剖析
未经允许不得转载:小狮博客 » C++ 原子操作使用及源码剖析
输出结果:Counter = 105516 每次不一样
原因分析:
Counter++ 看似是 “一步操作”,实际拆解为 3 个步骤:
1.读取Counter的当前值到寄存器;
2.寄存器值 + 1;
3.把新值写回Counter。
多线程执行时,可能出现 “线程 A 读值后,线程 B 抢先修改并写回,线程 A 再写回旧值 + 1” 的情况,导致计数丢失。