2014-01-21 288 views
0

在我的情況下,在兩個epoll_wait循環(兩個線程)中使用相同的fd(套接字),一個循環僅用於讀取(pollin),另一個僅用於寫入(pollout),pollout僅在I有數據要寫。通常,當套接字被peer關閉,pollin首先接收,是否有任何最簡單的方法來通知寫循環觸發pollout或pollerr事件(做一些乾淨的工作,並從epoll中刪除fd)?我在套接字被peer關閉後直接從read循環嘗試epoll_ctl(EPOLLOUT),但它只能在某個系統上工作。我也想添加timerfd來通知寫入循環。在我的情況下,從epoll中刪除fd的最佳方法是什麼?

回答

1

只需關閉插座fd。它會自動註銷epoll。我問過類似的問題,去年,並得到這樣的回答:

Is it necessary to deregister a socket from epoll before closing it?

如果你需要做額外的清理上此套接字的寫線程,只要有你寫的線程也聽的讀端管道fd。通過向管道寫入單字節來通知此線程(但在將消息排隊到線程安全的消息隊列之前不能指示要清除的內容)。

當epoll_wait返回管道上的指示數據時,讀取管道中的字節,使用隊列中的消息並執行相應的清理工作。

希望這會有所幫助。

相關問題