2012-10-03 37 views
1

所以如果一個線程鎖定一個互斥量然後啓動一個hrtimer。在定時器處理程序回調函數中,我可以解鎖該互斥鎖嗎?在Linux內核中,我可以在定時器處理程序中解鎖互斥鎖嗎?

我問這個,因爲我在mutex.h文件看到: 「只有所有者才能解鎖互斥體」 「任務可能無法與互斥退出舉辦」 「互斥體可能無法在硬件或軟件中斷使用上下文,如tasklets和定時器「

那麼是在中斷上下文中執行的定時器處理程序?在這種情況下,互斥體不能解鎖,因爲所有者不知道?所以也許我應該使用信號量?

感謝,


@Andy羅斯嗨,感謝您的reply.I在評論不會打字太多的話。我要做的是有點難以解釋。例如,我們在一個插座上有4個內核。核心0想要增加其頻率。爲此,首先需要增加插座電壓(電壓變化是插座電平),然後改變頻率。在更換過程中(通常更改電壓需要一些時間),其他內核也可能需要更改不應允許的插座電壓。因此核心0首先鎖定互斥鎖,然後發出電壓命令的更改,啓動計時器並立即返回以執行其他任務。當定時器到期時,它將檢查電壓變化是否已完成。如果是這樣,它將改變內核的頻率,然後解鎖互斥鎖,以允許其他內核改變插座的電壓。所以互斥量是套接字級別。 我想也許我可以使用睡眠。如果其他內核試圖在電壓改變結束之前改變電壓,他們將進行納秒睡眠()。

+0

你想做什麼?這聽起來很可疑,就像你試圖使用互斥體來控制進程等待一樣。如果你沒有使用互斥鎖作爲鎖/解鎖範例,你可能做錯了什麼... –

+0

@安迪羅斯你好,謝謝你的回覆。請檢查以下回答 –

回答

2

答案是NO。計時器在其他線程中運行。只有相同的線程才能解鎖。

對於您的問題,您應該使用狀態標誌/計數並更新它與atomic_set和朋友。使用該標誌來標識狀態,不要持有很長的互斥量。

如果您需要排隊更改電壓請求,請使用隊列。阻止一個漫長的過程永遠不是一個明智的想法。

+0

謝謝:>請在下面檢查我的帖子(或以上...) –

+0

看到更新的答案。 –

+0

有道理。所以我只是使用一個標誌並在電壓變化期間設置它。如果其他核心想要改變電壓,它將首先檢查標誌。如果該標記已設置,它會睡眠一段時間,然後再回來檢查它。它應該工作。 –

相關問題