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

时间:2019-12-15 01:04:48

标签: c++ multithreading mutex lock-free stdatomic

使用std::atomic而不是互斥锁的全部目的是:

  1. 更高的多线程代码性能(读者之间没有争用);
  2. 发生大量争用时,性能变化较小(对失败的RMW进行重试比丢失其余时间片少得多,因为持有互斥量的线程已准备好运行但未运行);
  3. 与信号处理程序进行通信的能力。

使用a table of mutexes“模拟”操作的原子性时:

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

那么为什么发现如此糟糕的原子CPU操作仿真值得呢? std::atomic中的非无锁定回退机制的用例是什么?

1 个答案:

答案 0 :(得分:14)

有时您必须编写可在多个平台上工作的代码,并且在某些平台上可能无需锁就可以支持原子操作,而在其他平台上可能没有锁。使用std::atomic可以为您带来两全其美的体验:平台可以支持的最佳性能,平台不能支持的合理行为。另一个好处是语义更干净,并且因疏忽而长时间保留比预期更长的时间的风险也较小。