自旋锁优化:提速5.7倍,能耗降5.4倍
Optimizing a Spin-Lock

自旋锁是一种永不休眠的锁机制,线程在CPU上持续轮转等待,不触发系统调用或上下文切换。本文通过四步优化,将自旋锁性能提升5.7倍,同时能耗降低5.4倍。从初始的简单原子交换实现,到引入内存序优化、测试与测试-设置策略,再到指数退避算法,每一步都显著减少了L1缓存缺失和分支预测错误。最终版本在四线程下耗时仅43纳秒,能耗降至11.92焦耳。虽然std::mutex仍是大多数场景下的首选,但在线程绑定专用核心的高并发场景下,精心优化的自旋锁能带来巨大收益。
自旋锁是一种永不休眠的锁,线程不会让出CPU,而是持续轮转等待。
HN 评论区
41- tombert
直到几年前开始使用 LMAX Disruptor,我才真正听说有人在生产代码中实际使用自旋锁。
我一直被告知这是一种反模式,我认为这通常是一条不错的经验法则,但我想就像计算机科学中的大多数事情一样:“好的经验法则”总有例外。
我至今仍未在生产环境中明确地为实现任何东西编写过自旋锁,但 Disruptor 向我展示了确实存在使用它的场景。
- dalvrosa
感谢分享!很乐意收到反馈 :)
请注意,我不推荐在大多数情况下使用自旋锁,仅当线程与物理 CPU 核心存在 1:1 映射时,并且仅在经过测量后才建议使用。
- jeffbee
如果运行在缓存共享更紧密的机器上,答案会不会有所不同?比如在 Intel 能效核集群上,4 个核心共享一个 L2 缓存。