可能重复:
为什么拿着自旋锁不能睡觉?
据我所知,自旋锁应该在短时间内使用,并且只是代码中的选择,例如不允许休眠(抢占)的中断处理程序。
但是,我不知道为什么会有这样一个“规则”,即在持有自旋锁时根本不应该睡觉。我知道这不是推荐的做法(因为它不利于性能),但我认为没有理由不应该在自旋锁中允许睡眠。
在获取信号量时不能持有自旋锁,因为在等待信号量时可能需要休眠,并且在持有自旋锁时不能休眠(来自 Robert Love 的“Linux Kernel Development”)。
我能看到的唯一原因是出于可移植性的原因,因为在单处理器中,自旋锁被实现为禁用中断,并且通过禁用中断,当然不允许休眠(但休眠不会破坏 SMP 系统中的代码)。
但我想知道我的推理是否正确,或者是否还有其他原因。