gpt4 book ai didi

c++原子读/写误区

转载 作者:IT老高 更新时间:2023-10-28 22:18:47 24 4
gpt4 key购买 nike

为什么使用此代码的程序有时会打印“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,但是不明白为什么会出错。

最佳答案

t3 与其他两个线程不同,它不执行原子添加。相反,它以原子方式加载 a,在临时变量上执行算术(加 1),然后以原子方式将新值存储回 a。这将覆盖 a 而不管其间可能发生的原子操作。

所以你可以有以下场景:

  1. t1t2 原子地递增 a 现在等于 1。
  2. t3 自动加载 1。
  3. t1t2 原子地递增 a 现在等于 2。
  4. t3 对先前加载的值执行非原子加法并原子地存储回 2。

关于c++原子读/写误区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27179560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com