Vic*_*voy 16 c++ multithreading atomic
为什么使用此代码编程有时会打印"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;
}
}
Run Code Online (Sandbox Code Playgroud)
我认为std::atomic保证所有操作都将以原子方式完成,因此写入(递增)将使用内存屏障,我们将始终3在线程结束时工作.我已经探索了代码,发现问题线程是t3但我无法理解为什么它是错误的.
use*_*016 26
t3与其他两个线程不同,它不执行原子添加.相反,它以原子方式加载a,对临时执行算术(加1),并以原子方式将新值存储回来a.a无论两者之间可能发生的原子操作如何,都会覆盖.
所以你可以有以下场景:
t1或t2原子增量a,现在等于1.t3 原子载荷1.t1或t2原子增量a,现在等于2.t3 对先前加载的值执行非原子添加并以原子方式存储回2.