缓存视角看锁竞争
更新时间:2026-10-01。锁的延迟问题在硬件层面往往就是一条 cache line 被多个核抢来抢去。
本文要回答的问题
- 获取/等待锁时缓存里发生了什么?
- 怎样减少锁导致的一致性流量?
一、弹跳机制
锁变量通常在一条 cache line 上。一个核持锁修改使其变脏,其它等待核自旋读取要不断获取该线,所有权在核间反复转移,产生大量 invalidate/重取;核越多越严重。若锁与受保护数据还落在同行,伪共享雪上加霜。
二、优化方向
缩小临界区降低持有时间;用分片锁/每核副本减少对同一行的争用;自旋加退避或用 MCS 等队列锁把“抢同一行”变成本地自旋 + 链式交接;把锁独占一行并按缓存行对齐。
三、常见坑
- 只从软件角度加锁,不理解一致性代价。
- 锁与热数据同行。
- 无退避的紧密自旋。
小结
锁慢多因锁行在核间弹跳,对策是缩小临界区、分片/队列锁、独占行与退避,诊断要看一致性流量。下一篇 缓存性能计数器与度量。
总结
锁的延迟在硬件层面通常就是锁变量所在的那条 cache line 在持锁核与等锁核之间反复 invalidate、转移所有权(bouncing),自旋核越多、产生的一致性流量越大,锁与受保护数据同行还会被伪共享放大;治本方向不是"换更快的锁",而是缩小临界区、分片锁/每核数据、自旋退避或 MCS 队列锁,并让锁独占一行对齐。诊断锁热点要看一致性事务和总线流量——软件里的一次 lock,物理上是一整条 cache line 的跨核搬运。