2016-01-21 66 views
-1

我有一個線程,試圖使用定時接收函數從消息隊列中讀取東西。該線程還具有一個互斥鎖,它用作指示它何時需要退出(例如,應用程序已關閉)的指示器:最初互斥鎖被鎖定,並且當它被解鎖(在其他地方)時,線程需要停止。解鎖從定時接收互斥解鎖

我想以這樣一種方式進行定時接收,即在解鎖互斥鎖時它也會解除阻塞。所以當我們被要求停止時,我們立即做到這一點,而不必等待定時接收超時。

在Windows中,我可以通過重疊IO和WaitForMultipleObjects()來實現。對命名管道的重疊讀取會返回一個對象,然後同時等待該對象和互斥鎖。

有沒有辦法在POSIX中做到這一點?

+0

你不能只是發佈一些消息到隊列來喚醒線程,所以讓它注意到一些'終止'布爾?在非平凡的操作系統上,如果線程在應用程序終止前不需要關閉,那麼你不應該明確地終止它,除非有一個壓倒性的要求。 –

+0

@MartinJames是的,實際上可以工作。 –

+0

C不是C++不是C!選擇一種語言。 – Olaf

回答

1

有很多方法。可能最簡單的方法是在線程停止時使用設置爲true的布爾值。用互斥鎖保護布爾值並讓線程定期檢查它。

更好的解決方案是使用原子布爾值。很可能,您正在使用一個平臺,無論是從C++ - 11還是編譯器內部函數,或者其他方式。

+0

如果只有一個作者和許多讀者,互斥量甚至不需要。 – Ctx

+0

@Ctx POSIX有一個[顯式要求](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_11),它的內存位置不能在一個線程中修改,或者可能是,在另一個訪問。所以你絕對要麼需要互斥體,要麼需要某種形式的原子操作。 –

+0

我的問題不是如何定期檢查互斥鎖,只要互斥鎖解鎖即可如何從定時接收中退出,即使這種情況發生在超時之前。假設您有超時1小時的定時接收。 5分鐘內互斥鎖解鎖。我希望定時接收在發生這種情況後立即返回,而不是等待剩餘的55分鐘。 –