我正在阅读一些代码,我在函数foo中看到:
// x is a global variable shared by all functions
spin_lock(&x);
if(some condition)
function();
spin_unlock(&x);在函数()中;
// do stuff
spin_lock_irqsave(&x, vals);
....如果“某个条件”为真,会不会出现死锁?这似乎太明显了,所以我想我可能遗漏了什么?
谢谢
编辑:代码不是linux的一部分,它只是我在网上找到的一些随机代码
发布于 2012-10-07 14:34:26
这段代码将死锁(假设没有递归锁定,并且这是一些Linux内核代码)。通常,当您想要保护代码不被中断抢占时,会使用spin_lock的irq版本。
调用irqrestore的原因是保存当前的中断状态并将其恢复。这是为了避免在抓取多个自旋锁或处于禁用中断的块中时过早打开中断。
发布于 2012-10-07 14:40:31
自旋锁是的,而且可能永远不会是,因为它们旨在成为高性能的锁。
因此,如果条件为真,则发布的代码将死锁。
发布于 2012-10-07 14:26:33
这将取决于spin_lock()和spin_lock_irqsave()是如何实现的。
例如,他们可以确定锁是否已经被相同的CPU锁定,如果是,则递增计数器;然后(当锁被释放时)递减计数器,只有在计数器变为零时才释放锁。这样,同一个CPU就可以多次获取锁,而不会导致死锁。
spin_lock_irqsave()也有可能只禁用IRQ,而不实际获取锁(例如,假设/期望IRQ已经被预先调用的东西)。在这种情况下,锁&x可能只是存储/跟踪IRQ被禁用/被禁用的事实的方便位置(并且可能spin_unlock()检查某些标志,并且如果IRQ被禁用,则再次启用IRQ)。
但是,我想不出spin_lock_irqsave()需要第二个参数(vals)的原因。
另一种可能性是,这些函数的名称具有误导性,与它们的实际功能毫无关系。例如,spin_lock()函数可能会订购披萨,而spin_lock_irqsave()函数可能会显示足球结果。
基本上,除了它们的名称之外,没有关于这些函数的任何信息,因此不可能确定它们做了什么(或者是否存在死锁)。
https://stackoverflow.com/questions/12766403
复制相似问题