首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用spin_lock和spin_lock_irqsave,死锁?

使用spin_lock和spin_lock_irqsave,死锁?
EN

Stack Overflow用户
提问于 2012-10-07 13:40:11
回答 3查看 5.9K关注 0票数 1

我正在阅读一些代码,我在函数foo中看到:

代码语言:javascript
复制
// x is a global variable shared by all functions
spin_lock(&x);
if(some condition)
    function();
spin_unlock(&x);

在函数()中;

代码语言:javascript
复制
// do stuff
spin_lock_irqsave(&x, vals);
....

如果“某个条件”为真,会不会出现死锁?这似乎太明显了,所以我想我可能遗漏了什么?

谢谢

编辑:代码不是linux的一部分,它只是我在网上找到的一些随机代码

EN

回答 3

Stack Overflow用户

发布于 2012-10-07 14:34:26

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-10-07 14:40:31

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

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

票数 1
EN

Stack Overflow用户

发布于 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()函数可能会显示足球结果。

基本上,除了它们的名称之外,没有关于这些函数的任何信息,因此不可能确定它们做了什么(或者是否存在死锁)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12766403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档