首页 > 解决方案 > 使用 c++ atomic 时写“y=++x”是否安全?

问题描述

如果我有 2 个线程并且在主函数中,我会像这样初始化一个变量 x

std::atomic<int> x=0;,

在线程 1 中,我这样做:

while(true){
  x++;
}

在线程 2 中,我这样做:

y=++x;

我的问题是:变量 y 有没有可能得到错误的数字?

我的意思是例如:

如果在thread2中,那一刻,x=2;那么因为“++x”,x=3,所以我希望y=3;

但是我怕在“++x”和“y=x”之间,线程1会再次重写x,所以我可能有y=4什么的。

标签: c++stdatomic

解决方案


如果担心 in 的y=++xx首先等于 2 ,然后增加到 3 ++x,然后在复制到 之前再次增加另一个线程y,那么答案是否定的 - 这不会发生。操作的结果++x不是对原子值本身的引用 - 它是int后增量的简单结果,并且操作保证您将在返回增量后准确地获得值(无需额外读取)。


推荐阅读