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

标签 c++ multithreading mutex lock-free stdatomic

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

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

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

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

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

最佳答案

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

关于c++ - 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59340448/

相关文章:

c++ - 编译器添加的优化导致 "final"方法的不同行为

c++ - 有没有办法在不改变参数的情况下改变回调的范围?

c++ - sizeof 运算符出错

java - 存储来自 URL 的原始 HTML 内容,然后从内存中获取 InputStream(不使用连接)

java - 如何杀死正在等待同步资源的线程?

c - 一般竞赛条件

C++:如何将变量作为参数传递给类构造函数

Java 线程在同步块(synchronized block)上加锁

android - 我需要在 Android Content-Provider 方法中使用互斥体吗?

在 C 中使用 pThread 将数组与多线程进行比较