在我目前忙于处理的内核中,有三个spin_lock函数。
我只发现只涉及其中两个的贡献(包括Linux文档)。
然后,答案或解释被表述成矛盾的或相互矛盾的,甚至包含评论,说解释是错误的。这使得很难得到一个概述。
我很清楚一些基本知识,例如在中断上下文中,一个简单的spin_lock()可能导致死锁。但我真的很想要一个关于这个主题的完整图片。
我要明白:
发布于 2019-05-15 09:20:40
第五章简要描述了Linux设备驱动程序,第三版的并发性和种族条件。
void spin_lock(spinlock_t *lock);
void spin_lock_irqsave(spinlock_t *lock, unsigned long flags);
void spin_lock_irq(spinlock_t *lock);
spin_lock_irqsave在使用自旋锁之前禁用中断(仅在本地处理器上);以前的中断状态存储在flags中。如果您绝对确信您的处理器上没有任何其他的中断已经禁用(或者,换句话说,您确信您应该在释放自旋锁时启用中断),则可以使用spin_lock_irq,而不必跟踪这些标志。
如果您希望spinlock可以保持在中断上下文中,那么spin_lock_irq*函数是很重要的。原因是,如果自旋锁由本地CPU持有,然后本地CPU为中断提供服务,而中断也试图锁定自旋锁,则会出现死锁。
https://unix.stackexchange.com/questions/519009
复制相似问题