2016-04-04 33 views
-1

我正在尋找解決方案喚醒選擇呼叫在c + +,根據應用程序要求我不能設置超時,因爲多線程使用選擇系統調用。如何喚醒從另一個線程沒有超時期限選擇呼叫

請參閱下面的場景。

我想喚醒在其他線程上選擇系統調用等待。我試圖從主線程寫入線程數據,但仍然無法喚醒它。

如果在此線程上有空數據,我想關閉線程和套接字。

它是喚醒選擇呼叫,如果套接字連接從其他進程關閉,但不與線程一起工作。

沒有任何一個有想法對此

+0

TCP中沒有空數據。 UDP中有空的數據報,但似乎不太可能是你正在談論的內容。不清楚你在問什麼。 – EJP

+0

你可以使用self pipe trick http://stackoverflow.com/a/384397/2807083 – user2807083

+3

你也可以用'signal(3)'中斷它。 – arrowd

回答

-1

謝謝大家的寶貴意見,我可以用shutdown()調用套接字FD來解決這個問題,使用這個link上存在的參考答案,它會通過喚醒信號選擇,它正在等待動作。我們應該在選擇通話後關閉插座,否則選擇不會獲得喚醒信號。

2

在最近的Linux可以使用eventfd,對一般的東西 - 管,用法 - 註冊在選擇的可讀性管道的一側與實際的插座部分(s ),喚醒選擇器 - 只需將一個字節寫入管道的另一端。或者(如果你的libc擁有它),你可以使用帶有sigmask的pselect來捕獲ALRM信號,並在需要喚醒選擇器時發出該信號。在多線程應用程序中使用信號方法時要非常小心(如「我不會使用」),好像做得不對,信號可能會傳送到隨機線程。