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

What's the point of std::atomic for types that the CPU can't atomically manipulate?

本文关键字:atomic 什么 std CPU 原子操作 类型 对于      更新时间:2023-10-16

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

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

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

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

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

有时您必须编写可以在多个平台上工作的代码,并且在某些平台上可能不支持原子操作而没有锁定,而在其他平台上可能不支持。使用std::atomic可以为您提供两全其美的效果 - 平台可以支持它的最佳性能,以及平台无法支持的理智行为。附带的好处是语义更清晰,无意中持有锁的时间比预期多或少的风险更小。