Я использую 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;
}