在Linux内核中,我可以在计时器处理程序中解锁互斥锁吗?

时间:2012-10-03 02:33:24

标签: linux linux-kernel mutex

因此,如果一个线程锁定一个互斥锁,然后启动一个hrtimer。在计时器处理程序回调函数中,我可以解锁该互斥锁吗?

我问这个是因为我在mutex.h文件中看到过: “只有主人可以解锁互斥锁” “任务可能无法通过互斥锁保持退出” “互斥体不得用于硬件或软件中断上下文,如tasklet和定时器”

在中断上下文中执行的计时器处理程序是什么?在这种情况下,互斥锁无法解锁,因为所有者不知道?那么也许我应该使用信号量?

谢谢,


@Andy Ross嗨,谢谢你的回复。我不能在评论中输入太多的词。我要做的是有点难以解释。例如,我们在一个插槽上有4个内核。核心0希望增加其频率。为此,首先需要增加插座电压(电压变化是插座电平)然后改变频率。在改变过程中(通常改变电压需要一些时间),其他核心也可能想要改变不应允许的插座电压。因此,核心0首先锁定互斥锁,然后发出电压命令的更改,启动计时器并立即返回运行其他任务。当计时器到期时,它将检查电压变化是否已经完成。如果是这样,它将改变内核的频率,然后解锁互斥锁,以允许其他内核更改插座的电压。因此互斥锁是套接字级别的。 我想也许我可以睡一觉。如果其他核心试图在电压变化完成之前改变电压,那么它们会做一个nanosleep()例如。

1 个答案:

答案 0 :(得分:2)

答案是否定的。 Timer在其他线程中运行。只有同一个线程可以解锁。

对于您的问题,您应该使用状态标记/计数并使用atomic_set和朋友更新它。使用该标志来识别状态,不要长时间持有互斥锁。

如果您需要排队电压变更请求,请使用队列。阻止一个长期过程永远不是一个明智的想法。