其实 spin_lock() 通过调用禁用抢占 preempt_disable() 在尝试获取锁定之前,情境#1,#2,#3永远不会发生。 从最近的源代码, 用spin_lock() 最终打电话 __raw_spin_lock() ,哪个电话 preempt_disable() 在打电话之前 spin_acquire() 获得锁定。 spin_lock_irqsave() 在中断上下文中常用的具有类似的上下文。
spin_lock()
preempt_disable()
spin_acquire()
spin_lock_irqsave()
关于#3,如果变量在进程/中断上下文之间共享,则应始终使用 spin_lock_irq()/spin_lock_irqsave() 代替 spin_lock() 避免死锁情况。
spin_lock_irq()/spin_lock_irqsave()