2011-05-17 85 views
7

我有一個使用epoll(7)的多線程linux程序。 epoll(7)手冊頁說,當其中一個fds被關閉時,該fd將自動從epoll集中移除。我的問題是如果epoll集的fd在一個線程中關閉,而epoll集在另一個線程中同時輪詢而沒有同步。程序是否會被破壞,或者內核是否會自動同步這個訪問?Linux中多線程epoll的問題

感謝

回答

7

在epoll的集中的FDS是由內核維護,所以你是安全的 - 內核處理任何必要的同步。

也就是說,在fd關閉之前,fd上的事件仍然存在於另一個線程中。因此,可能有一個fd中的事件不再出現在集合中。有了精心設計的程序,這不應該導致問題。

+0

+1我的linux 2.6測試框中的FWIW,正在epoll_wait()ed時關閉()讀取管道的fd似乎無聲地從輪詢組中刪除fd。所以,最糟糕的情況是,如果epoll_wait()不確定,並且close()d fd是唯一的fd或唯一保證喚醒進程的fd,那麼您可能永遠掛起。 – pilcrow 2011-05-18 16:47:58