2011-07-27 143 views
2

我是使用epoll進行linux服務器編程的新手。 我有2個線程:Thread_Accept和Thread_epoll。前者是塊接受循環,如果新連接即將到來,它將使用epoll_ctl()添加新的fd。後者是一個大的epoll_wait()循環。在一個線程中執行epoll_ctl,而另一個線程處於epoll_wait中間

現在我的問題是:如果當Thread_Acepts執行epoll_ctl()而Thread_epoll處於epoll_wait中間時呢?會有副作用嗎?

在此先感謝。

問候, 馬丁

回答

1

從epoll_wait手冊頁:

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

所以,:-)

添加一個新的文件描述符時無副作用(本手冊頁筆記是nathansizemore提到的錯誤的結果)

0

你爲什麼不讓它有一個線程?

您可以設置監聽套接字非阻塞和插座添加到您的大epoll_wait

+0

伊萬,我知道了。但不是它分裂爲兩個線程會獲得更好的表現嗎?只是我的想法。 –

+0

關於獲得更好的表現,我不確定。在這種情況下,您需要通過鎖定來保護每個epoll_ctl。恕我直言,它只會增加您的代碼的複雜性 –

0
+0

您在「這說不然」中指出的鏈接實際上與您一致。您可以在線程1中調用epoll_ctl(),而線程2是epoll_wait()ing,並且在epoll_ctl()ed的fd可用時它會正常喚醒。 –

+0

@DannyDulai我說「它會產生副作用」(根據我的經驗),但「這說其他」鏈接指出它不會。 – nathansizemore

相關問題