2016-08-24 176 views
1

我有一個pthread對某些文件描述符進行無限輪詢,並帶有負超時參數。如何從主線程中優雅地阻塞pthread退出?

從主線程,我希望能夠向輪詢線程表明它應該退出。

我做了一些研究,發現了以下方法:

  1. 使用pthread_cancel可以():這是氣餒,因爲這可能導致不清除任何保留的資源或互斥

  2. 使用的意想不到的後果一個變量作爲標誌並將其設置在主線程中。輪詢線程每次迭代檢查該標誌,如果設置,則通過調用pthread_exit()退出。這種方法是行不通的,因爲我的輪詢線程不循環,而是無限期地阻塞,等待文件描述符。

任何人都可以提出一個優雅的解決方案來解決這個問題嗎?

謝謝! ASM

+2

添加一個eventfd到你信號終止的混音? –

+0

這是一個很好的建議。我可以嘗試。謝謝! –

回答

5

您可以使用pipe(2)創建一個匿名管道,並讓文件描述符監視線程將讀取結束添加到其輪詢的文件描述符,並在該文件描述符報告EOF時退出。主線程然後在它想要線程退出時關閉寫入結束。

1

您可以使用pthread_kill()向阻塞線程發送信號(例如SIGUSR1)。然後select呼叫應返回一個負值並將errno設置爲EINTR。不要忘記爲你發送的信號設置一個處理程序。