簡體   English   中英

請求阻塞線程退出

[英]Ask blocking thread to exit

我有一個 C++ 線程 (Linux),它使用阻塞讀取來獲取某些 IO 接口上的數據。 我希望能夠中止讀取並退出線程。

這里https://stackoverflow.com/a/51742996/16317303解釋了一般原理,使用pthread_kill向特定線程發送信號中斷阻塞讀取。

但是,當我以這種方式實現時,我錯過了“向特定線程發送信號”部分。 例如,終端中的 CTRL+C 會觸發與pthread_kill相同的處理程序,這意味着 CTRL+C 不再結束控制台應用程序。 對我來說,它似乎是任何 SIGINT 的全局處理程序,而且我不知道如何才能做到只有這個特定的線程接收信號並采取行動,否則,當我將這種模式用於不同的線程時,我可以' 區分哪個線程接收到信號。

請參閱@dimich 對該問題的評論。 我使用eventfd()poll()來實現所需的行為,手冊頁提供了隨時可用的示例代碼。

信號處理程序確實是全局的。

如您所見,當為進程(如通過killCtrl + C )而不是為特定線程(如通過pthread_kill或浮點異常)生成信號時,操作系統只是選擇該進程的一個線程來接收信號。 (參考POSIX.1-2017 信號概念

您可以通過阻止(屏蔽)所有線程中的信號來影響此選擇,除了您想要接收信號的特殊線程。 由於線程信號掩碼是繼承的,一個典型的方法是直接在main()中用pthread_sigmask(SIG_BLOCK, ...)屏蔽信號,然后在你的特殊線程中取消屏蔽它 (SIG_UNBLOCK)。

但這是一種可疑的方法。 SIGINT 似乎是使用錯誤的信號,因為它具有完善的語義——我希望Ctrl + C終止前台進程組,此外,正如其他人所建議的那樣,I/O 與“通知 fd”進行多路復用。 更干凈,更不容易出錯。

如果您盡可能避免信號,通常會更容易。

您可以使文件描述符成為非阻塞的,而不是進行阻塞read ,然后使用poll (阻塞)同時等待幾件事。 您可以讓它在等待輸入數據的同時等待關機信號。 如果其中任何一個發生,它就會返回,並告訴你是哪一個發生了。

為了使這項工作正常進行,關閉信號必須是您可以從中讀取數據的信號,例如 pipe 或(如 sctty 建議的那樣) eventfd 當您寫入 pipe 的另一端時, poll返回,說“嘿,您現在可以從 pipe 讀取數據”,但您不想實際從中讀取數據。 您只想在發生這種情況時關閉(並關閉管道)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM