最佳答案
我正在使用 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;
}