Почему программа с этим кодом иногда печатает "2"?
int main() {
std::atomic<int> a;
a = 0;
std::thread t1([&]{++a;});
std::thread t2([&]{a++;});
std::thread t3([&]{
a = a.load() + 1;
});
t1.join();
t2.join();
t3.join();
if (a != 3) {
std::cout << "a: " << a << std::endl;
}
}
Я думал, что std::atomic
гарантирует, что все операции будут выполняться атомарно, поэтому запись здесь (приращение) будет использовать барьер памяти, и мы будем всегда 3
в конце работы потоков. Я изучил этот код и выяснил, что поток проблем t3
, но я не могу понять, почему это неправильно.