1

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

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

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

谢谢,


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

4

1 回答 1

2

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

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

如果您需要排队电压更改请求,请使用队列。阻止这么长的进程绝不是一个明智的主意。

于 2012-10-03T03:27:56.070 回答