对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
What's the point of std::atomic for types that the CPU can't atomically manipulate?
使用std::atomic
而不是互斥体的全部意义在于获得:
- 多线程代码的性能更高(读取器之间没有争用(;
- 发生严重争用时性能变化较小(对失败的 RMW 重试不如丢失剩余时间片那么剧烈,因为持有互斥锁的线程已准备好运行但未运行(;
- 与信号处理程序通信的能力。
当操作的原子性使用互斥体表"模拟"时:
- 性能充其量只能与用户互斥锁一样好,因为只需要一个修改操作;当按顺序使用多个操作时,需要发生多个锁定/解锁操作,从而使代码效率降低。
- 性能不会比显式用户互斥锁更可预测。
- 这种"模拟"原子性不能与阻止其他代码的代码(例如信号处理程序(一起使用。
那么,为什么对原子CPU操作的这种糟糕的模拟是值得的呢?std::atomic
中非无锁回退机制的用例是什么?
有时您必须编写可以在多个平台上工作的代码,并且在某些平台上可能不支持原子操作而没有锁定,而在其他平台上可能不支持。使用std::atomic
可以为您提供两全其美的效果 - 平台可以支持它的最佳性能,以及平台无法支持的理智行为。附带的好处是语义更清晰,无意中持有锁的时间比预期多或少的风险更小。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- C++std::atomic在程序员级别保证了什么
- MyType 允许 std::atomic 的确切要求是什么<MyType>?
- Red Hat:使用<atomic>编译很好,但链接器找不到__atomic_store_16;什么库?
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- 在 atomic() 中 ++、add operation 和 fetch_add() 有什么区别
- 最接近"std::atomic<std::vector>"是什么?
- atomic.store 和atomic_thread_fence有什么区别?
- 什么's是对std::atomic<T>
- boost::atomic的标头是什么
- 在C++11 std::atomic中,++、--和==等运算符使用的memory_order是什么
- c++,std::atomic,什么是std::memory_order以及如何使用它们
- "atomic"和"cstdatomic"有什么区别?
- std::atomic到底是什么?