互斥锁是空间换时间(通过线程切换让出 CPU 给别人用),适合重型任务;自旋锁是时间换空间(省去了切换开销但空耗 CPU),适合极致轻量的原子操作。
2. 深度理解:什么时候该用谁?
这是面试中展现“工程深度”的关键点:
互斥锁的“重”
互斥锁的“重”在于上下文切换。当锁被占用时,内核会保存当前线程的寄存器、栈顶指针等,然后切换到另一个线程。如果你的临界区代码执行只需要 10ns,而切换一次上下文要 2000ns,那用互斥锁就是“大炮打蚊子”,极其低效。
自旋锁的“险”
自旋锁的“险”在于单核死锁和优先级反转:
单核环境:如果自旋线程和持有锁的线程在同一个核上,自旋线程不放 CPU,持有锁的线程就没法运行来释放锁。这会导致死锁(现代 OS 有优化,但原理如此)。
长时间占用:如果持有锁的线程被系统切走了,自旋线程会白白浪费成千上万个 CPU 周期在等待。
在高性能后端开发中(如你关注的 C++ 框架),通常