提问者:小点点

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


使用<code>std::atomic</code>而不是互斥锁的全部目的是获得:

    < li >多线程代码的更高性能(读取器之间无争用); < li >当发生严重争用时,性能变化较小(在失败的RMW上重试不如丢失剩余的时间片剧烈,因为持有互斥体的线程准备运行但没有运行); < li >与信号处理器通信的能力。

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

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

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


共1个答案

匿名用户

有时,您必须编写可以在多个平台上工作的代码,原子操作可能在一些平台上不受锁的支持,而在其他平台上可能不受支持。使用< code>std::atomic可以让您两全其美——在平台支持的情况下获得最佳性能,在平台不支持的情况下获得合理的行为。另一个好处是语义更清晰,不经意地持有锁的时间比预期的长或短的风险更小。