对于 CPU 无法原子操作的类型, std::atomic 有什么意义?

cur*_*guy 1 c++ multithreading mutex lock-free stdatomic

使用std::atomic而不是互斥锁的全部意义在于:

  1. 更高的多线程代码性能(阅读器之间没有争用);
  2. 发生严重争用时的性能变化较小(重试失败的 RMW 不如失去剩余时间片那么剧烈,因为持有互斥锁的线程已准备好运行但未运行);
  3. 与信号处理程序通信的能力。

当使用互斥表“模拟”操作的原子性时:

  1. 对于只需要一个修改操作的情况,性能充其量与用户互斥锁一样好;当多个操作顺序使用时,将需要进行多次加锁/解锁操作,从而降低代码效率。
  2. 性能将不会比使用显式用户互斥锁更可预测。
  3. 这种“模拟”原子性不能与阻塞其他代码(例如信号处理程序)的代码一起使用。

那么为什么对原子 CPU 操作的这种糟糕的模拟值得呢?中非无锁回退机制的用例是std::atomic什么?

Dav*_*rtz 15

有时您必须编写可以在多个平台上工作的代码,并且在某些平台上可能不加锁地支持原子操作,而在其他平台上可能不支持。使用std::atomic可为您提供两全其美的优势——平台可以支持的最佳性能和平台无法支持的理智行为。一个附带的好处是更清晰的语义和更少的意外持有锁比预期时间更长或更短的风险。