【问题标题】:In Linux kernel, can I unlock a mutex in a timer handler?在 Linux 内核中,我可以在计时器处理程序中解锁互斥锁吗?
【发布时间】:2012-09-23 22:46:40
【问题描述】:

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

我问这个是因为我在 mutex.h 文件中看到过: “只有所有者才能解锁互斥锁” “任务可能不会在持有互斥锁的情况下退出” “互斥锁不能用于硬件或软件中断上下文,例如小任务和计时器”

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

谢谢,


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

【问题讨论】:

  • 你想做什么?这听起来很可疑,就像您正在尝试使用互斥锁来控制进程等待。如果您没有将互斥锁用于锁定/解锁范例,那么您可能做错了什么......
  • @Andy Ross 嗨,谢谢您的回复。检查以下答案

标签: linux linux-kernel mutex


【解决方案1】:

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

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

如果您需要对电压更改请求进行排队,请使用队列。阻止这么长时间的进程绝不是明智的想法。

【讨论】:

  • 谢谢你:>查看我的帖子下方(或上方...)
  • 有道理。所以我只是使用一个标志并在电压变化期间设置它。如果其他核心要改变电压,它会先检查标志。如果设置了标志,它将休眠一段时间,稍后再回来检查。它应该可以工作。
猜你喜欢
  • 2016-05-25
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
相关资源
最近更新 更多