c++ - 使用 std::atomic::compare_exchange_strong 时,对 std::atomic 的写入是否会被其他线程看不到?

标签 c++ multithreading

std::atomic<int> g_atomic;

void thread0()
{
  int oldVal = 0;
  int newVal = 1;
  while (g_atomic.compare_exchange_strong(oldVal, newVal, std::memory_order_acq_rel, std::memory_order_acquire))
  {
    // forever counting from 0 to 100 until unexpected value appears
    oldVal = newVal;
    newVal = (oldVal + 1) % 100;
  };
}

void thread1()
{
  // set unexpected value
  g_atomic.store(-1, std::memory_order_release);
}

int main()
{
  g_atomic.store(0);
  std::thread t0(thread0);
  std::thread t1(thread1);
  t0.join();
  t1.join();
  return 0;
}

是否会发生来自线程 1 的写入在线程 0 中可见之前以某种方式在线程 0 的循环中被覆盖? 该程序将永远运行。在我的测试中不会发生这种情况,但是如果有任何保证说情况总是如此,我很感兴趣。

最佳答案

因此,要对此提供明确的答案,不,thread0 永远不会错过来自 thread1 的写入。

这是因为 std::atomic::compare_exchange_strong 是一个原子操作,所以来自 thread0 的写入要么发生在这个操作开始之前(在这种情况下它返回 false)或者在它完成之后(在这种情况下,调用将在循环的下一次失败)。

如果是任何其他方式,compare_exchange_strong 将没有任何用处,不是吗?

关于c++ - 使用 std::atomic::compare_exchange_strong 时,对 std::atomic 的写入是否会被其他线程看不到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54480931/

相关文章:

Python - 如何将线程变成线程安全

java - 从多个线程调用时 Thread.sleep() 如何工作

java - 这些java线程是否正在等待它获取的锁?

c++ - 有哪些不同的可能方法可以降低给定程序中 vector 数组实现堆栈的时间复杂度……?

c++ - 字符串编码问题?

c - 对称多处理系统的输出

multithreading - 解决 Go 中的重复互斥锁

c++ - 输出的 GiNaC 顺序

c++ - readsome() 是否适合在 Windows 上读取二进制数据?

c++ - 比较表达式或变量之间的性能差异