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

时间:2016-01-22 04:31:02

标签: c++ multithreading c++11 atomic

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? 
}

1 个答案:

答案 0 :(得分: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.
}

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

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.
}