我正在使用Cygwin GCC并运行以下代码:
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
unsigned u = 0;
void foo()
{
u++;
}
int main()
{
vector<thread> threads;
for(int i = 0; i < 1000; i++) {
threads.push_back (thread (foo));
}
for (auto& t : threads) t.join();
cout << u << endl;
return 0;
}
编译行:g++ -Wall -fexceptions -g -std=c++14 -c main.cpp -o main.o
。
它打印1000,这是正确的。但是,由于线程会覆盖先前增加的值,因此我希望使用较小的数字。为什么此代码不会相互访问?
我的测试机有4个核心,对已知的程序没有任何限制。
foo
用更复杂的内容替换共享内容时,问题仍然存在
if (u % 3 == 0) {
u += 4;
} else {
u -= 1;
}
while true; do res=$(./a.out); if [[ $res != 1000 ]]; then echo $res; break; fi; done;
在我的系统上打印999或998的内容。
u
回内存。实际上,CPU会做一些令人惊奇的事情,例如注意内存行u
不在CPU的高速缓存中,它将重新开始增量操作。这就是为什么从x86迁移到其他体系结构可以令人大开眼界的原因!