這是在Linux上,但理想情況下,我想要一個POSIX兼容的解決方案。有什麼辦法可以鎖定互斥鎖,並讓它在給定時間後自動解鎖?
我有兩個線程,每個線程都可以通過API函數寫入硬件總線。在任何給定的時間,只有一個線程被允許寫入總線,並且在總線寫入之後,總線不能寫入數百毫秒量級的給定時間。
這兩個線程都是作爲狀態機實現的。
顯而易見的解決方案是使用互斥鎖來串行訪問總線,設置計數器或時間戳,並讓狀態機在適當的時間到期後解鎖互斥鎖。
這對我來說似乎有點脆弱。如果未來的維護開發人員錯誤地修改狀態機,則該互斥體可能無法釋放,從而導致難以診斷的死鎖。
是否有一個API調用會鎖定互斥鎖,但會在給定的超時後自動解鎖它?谷歌揭示pthread_mutex_timedlock(),但這不完全相同的事情。
設置計時器,在到期時解鎖互斥鎖。 – mah
@mah:你不能從一個信號處理程序調用'pthread_mutex_unlock',可以嗎?那麼我們在談論什麼類型的計時器,以及它何時有機會在持有鎖的線程上下文中運行? Linux至少有'SIGEV_THREAD_ID',它可以讓你在正確的線程中得到一個信號,你可以用它設置一個標誌來告訴線程釋放互斥量。但線程將不得不定期檢查標誌。 –
@SteveJessop我在pthread_mutex_unlock的手冊頁中看不到它在信號處理程序中不能使用的明確指示,儘管我在那裏看到的內容可能不明確 - 表明在處理完信號後,線程將繼續等待互斥體信號沒有發生。我不知道這是否意味着即使互斥鎖已解鎖,線程也不會注意到(儘管我希望不會!)。我認爲解決這個問題的一個非常難看的方法是讓信號處理程序啓動一個新線程,其唯一目的是解鎖互斥鎖。 – mah