2010-02-11 57 views
7

當前場景是epoll_wait通過幾個fds和一個可能的傳入消息隊列,我想要在IO事件或新消息上執行epoll_wait下面的循環。
的方法,我知道:用非IO事件中斷epoll_wait,沒有信號

  • 使用time毫秒超時和檢查隊列第一件事就是循環
  • 使用self-pipe trick從消息時變得可用
  • 中斷與標準信號系統調用的隊列代碼
  • 使用epoll_pwait和完善之前的點

無上面貼了點滿足我enoug h,我想知道是否還有其他方法,我沒有找到。
的原因是:

  • 信號是什麼,以避免對多線程代碼,並不十分可靠
  • 超時一個刪除的epoll的部分利益,只有事件
  • 自管伎倆看起來清醒目前最好的方法,但仍然太多的樣板

想法?

回答

17

你可以使用一個eventfd,它與自我管道技巧實際上是一樣的,除了使用較少的文件描述符和較少的樣板文件(例如glibc具有便利的eventfd_read/write函數)。

+0

當只有一個線程正在等待epollfd時,我已經成功地使用了eventfd,但是多線程正在等待* same * epollfd? eventfd在這種情況下也很有用嗎?如果是這樣,怎麼樣? – 2015-02-16 10:33:41

1

您已經列舉了可以喚醒epoll的事件,所以問題真的變成了:「我如何減少自我管道技巧的樣板?

該問題的答案實際上取決於您的代碼,語言以及您正在嘗試執行的操作。我假設你有一個處理I/O的線程,並且當沒有I/O準備就緒時你想在那個線程中做其他工作。在管理epoll循環的代碼中,它可以有一個內部句柄作爲「喚醒」函數或「提交工作」函數公開給系統的其他部分。

有這樣的庫,例如boost.asio for C++。但是,如果您只是針對epoll,編寫自己的代碼並不難,並且一旦您擁有了類/模塊/處理epoll循環的任何內容,實際樣板代碼的數量應該最小。