确实是因为无效竞争. 可以看看操作系统相关章节, 一般是CPU->缓存->内存的线路出现问题.
一般程序不会这么设计, 有两种方案,
第一, 加锁, 或用原子变量.
第二, 是无锁设计, 但要求不能对同变量无效竞争, 可以用两个变量各自计算, 然后相加, MapReduce
两个线程对globalVariable进行自增和自减操作,但是这两个操作并不是原子性的。也就是说,自增和自减操作可能涉及到多个底层指令,而线程的切换可能发生在任意一个指令的执行点。所以会出现这种情况,为了防止这种情况发生,可以使用互斥锁防止冲突。代码如下:
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
int globalVariable = 0;
mutex mtx;
void task1() {
for (int i = 0; i < 1000000; i++) {
mtx.lock(); // 锁定互斥锁
globalVariable++;
globalVariable--;
mtx.unlock(); // 解锁互斥锁
}
}
int main() {
thread t1(task1);
thread t2(task1);
t1.join();
t2.join();
cout << "current value is " << globalVariable << endl;
return 0;
}