c++ - std::atomic 变量的比较操作线程安全吗?

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

最佳答案

只有在以下情况下才是线程安全的:

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

关于c++ - std::atomic 变量的比较操作线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34939041/

相关文章:

java - ThreadPoolExecutor 的 maximumPoolSize 是如何工作的?

java - 将参数传递给同步块(synchronized block)的目的是什么?

c++ - 为什么在 C++11 中需要 decltype?

c++ - C++ 中的列表列表

继承语句中的 C++ 部分特化?

c++ - 有谁知道如何使用 qt creator 调试子进程?

java - 如何在 java 中使用 N 个线程对 M 个数字的数组进行排序?

c++ - 将 lambda 作为回调传递给 C 函数

c++ - 模板运算符重载中的类型冲突

c++ - 使用 if 条件对数字进行分组