我已经编写了这段代码作为测试:
#include <iostream>
#include <thread>
#include <mutex>
int counter = 0;
auto inc(int a) {
for (int k = 0; k < a; ++k)
++counter;
}
int main() {
auto a = std::thread{ inc, 100000 };
auto b = std::thread{ inc, 100000 };
a.join();
b.join();
std::cout << counter;
return 0;
}
该counter
变量是全局变量,因此创建了 2 个线程a
,并且b
我希望找到数据竞争。输出是 200000 而不是随机数。为什么?
此代码是使用 a 的固定版本,mutex
因此全局变量只能访问一次(每次 1 个线程)。结果仍然是 200000 。
std::mutex mutex;
auto inc(int a) {
mutex.lock();
for (int k = 0; k < a; ++k)
++counter;
mutex.unlock();
}
事实是这样的。互斥体解决方案给了我 200000 这是正确的,因为一次只有 1 个威胁可以访问计数器。但是为什么非互斥解决方案仍然显示200000?