对于std :: atomic变量,比较操作线程是否安全?

rdo*_*rdo 2 c++ multithreading atomic c++11

std::atomic有一些运算符,如:+, - ,++, - (post和pre)并保证它们是线程安全的,但是比较操作线程安全吗?我的意思是:

std::atomic<int> a = 10;
int i = 20;

void func() {
  a++; // atomic and thread safe
  if (a > i) // is it thread safe? 
}
Run Code Online (Sandbox Code Playgroud)

pad*_*ddy 5

这仅在以下情况下是线程安全的:

  • i永远不会改变(你真的应该改变const)
  • 如果a++将值更改为大于i连续原子负载将满足的值,则不要指望a > i.两个单独的原子指令不是原子的.
  • 您不需要分支代码是原子的

请注意这里的最后一点.你可以自由比较a > i.这将原子地获取当前值,a然后使用该值进行比较i.但是,之后的实际值a可能会立即发生变化.只要您的分支机构不依赖于未发生的情况,这很好.

if( a > i )
{
    // a is not guaranteed to be greater than i at this point.
}
Run Code Online (Sandbox Code Playgroud)

我不太确定你的逻辑是如何工作的,但你可能有这样的意思:

if( ++a > i )
{
    // a is still not guaranteed to be greater than i at this point,
    // but AT THE TIME OF INCREMENTING it did exceed i.
}
Run Code Online (Sandbox Code Playgroud)