1

我正在阅读一些代码,并在函数 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的一部分,只是我在网上找到的一些随机代码

4

3 回答 3

1

自旋锁不是递归的,而且可能永远不会,因为它们旨在成为高性能锁。

因此,如果条件为真,发布的代码将死锁。

于 2012-10-07T06:40:30.557 回答
1

此代码将死锁(假设没有递归锁定并且这是一些 Linux 内核代码)。当你想保护你的代码不被中断抢占时,通常会使用 spin_lock 的 irq 版本。

vals的原因是为了保存当前的中断状态,在调用irqrestore的时候恢复。这是为了避免在获取多个自旋锁或处于禁用中断的块中时过早打开中断。

于 2012-10-07T06:34:26.273 回答
0

这将取决于如何spin_lock()以及spin_lock_irqsave()已经实施。

例如,他们可能会确定锁是否已经被同一个 CPU 锁定,如果是,则增加一个计数器;然后(当锁被释放时)递减计数器,只有当计数器变为零时才释放锁。这样同一个 CPU 可以多次获取锁,不会导致死锁。

也有可能spin_lock_irqsave()是只禁用 IRQ 的东西,实际上并不获取锁(例如,假设/预期spin_lock()已经被预先调用的东西)。在这种情况下,锁&x可能只是一个方便的地方来存储/跟踪 IRQ 被禁用的事实(spin_unlock()如果它们被禁用,可能会检查一些标志并再次启用 IRQ)。

但是,我想不出spin_lock_irqsave()需要第二个参数(vals)的理由。

另一种可能性是这些函数的名称具有误导性,与它们实际所做的完全无关。例如; 该spin_lock()函数可能会订购比萨饼,并且该spin_lock_irqsave()函数可能会显示足球结果。

基本上,除了它们的名称之外,没有关于这些函数的信息,因此无法确定它们的作用(或者是否存在死锁)。

于 2012-10-07T06:26:32.773 回答