2016-01-02 89 views
2

如果一個線程(如X)正在等待epoll_wait(),另一個線程(比如Y)會調用epoll_ctl()來註冊對文件描述符9的興趣。先前在線程X中調用epoll_wait()能否返回線程Y添加的文件描述符9?對epoll_wait()的初始呼叫在任何時候都不會在中間返回。epoll或kqueue可以處理文件描述符自身的異步添加

現在我想比較一下,並詢問操作系統中另外兩個輪詢調用的相關問題。 poll()kqueue

  1. 如果回答上述問題是真的,那麼有沒有辦法實現與poll()系統調用類似的行爲?
  2. 讓我們假設epoll_ctl()是線程安全的,並且線程X可以安全地調用epoll_ctl()並致電epoll_wait()返回文件描述符9是否已準備好進行I/O。聲明對文件描述符感興趣的函數和等待的函數的分離是什麼使得該函數令人驚訝。但是人們經常將kqueueepoll稱爲用於相同的功能。但kqueue沒有單獨的函數來聲明獲取描述符的事件反饋的興趣。有沒有人知道kqueue如何以與epoll類似的方式使用? epoll似乎是最好的線程安全的選項那裏現在如果它允許線程「申報利益」
+1

有了'kqueue'你可能*申報利益* *沒有得到事件反饋*通過傳遞0作爲'nevents'參數。看,例如,[這個答案](http://stackoverflow.com/questions/5756402/how-do-i-replace-select-with-kevent-for-higher-performance) – Tsyvarev

回答

2

man epoll_wait

當一個線程阻塞調用epoll_pwait(),它是另一個線程可能會將文件描述符添加到等待的epoll實例中。如果新文件描述符準備就緒,它將導致epoll_wait()調用解除阻塞。

因此epoll_wait監視在等待時添加的文件描述符。

這種行爲不能通過poll()/ select()來實現,因爲他們讀取一組文件描述符一次,所以無法修改當前輪詢的文件描述符集合。

[當然,如果你路過epoll_create創建poll()/select()文件描述符,這個文件描述符的修改將被跟蹤與epoll_wait]

+0

我不知道有一個'epoll_pwait' ..'epoll_wait()'和'epoll_pwait()'有什麼區別? – Curious

+1

嗯,它看起來像手冊頁中的印刷錯誤:在同一句中它使用'epoll_pwait'和'epoll_wait',而實際上意味着相同的功能。 'epoll_pwait'不同於'epoll_wait',因爲它還允許在執行期間給定信號集。請參閱男人瞭解更多細節。 – Tsyvarev

+0

'epoll_pwait'不是印刷錯誤,它是'epoll_wait'的一個變種,它允許進行安全信號處理的管理。閱讀更多信息[這裏](http://linux.die.net/man/2/epoll_pwait)。 – Myst