[英]epoll with edge triggering, one shot and multithreading
這是關於此答案的一個問題: https ://stackoverflow.com/a/14241095/2332808(會對此進行評論,但顯然無法創建新帳戶,對此感到抱歉。很難找到有關epollet /多線程的資源。 )
建議使用epoll如下:
epoll_ctl()
激活通知(如果使用EPOLLONESHOT
則重新激活)。 read()
/ recv()
/ accept()
,直到錯誤EAGAIN
為止。 epoll_wait()
接收通知。 但是,假設在同一epollfd上的epoll_wait()
有多個線程,如果在完成讀取之前接收到更多的數據(例如,以兩個線程處理結束),則在同一fd上喚醒另一個線程不會冒此風險。相同的FD)
即使您將所有內容轉過來,然后將read()
直到EAGAIN
, epoll_ctl()
然后再次調用read()
來檢查仍然沒有任何內容(以避免在最后一次讀取到epoll_ctl()
之間收到爭奪的情況)。 ..
但是仍然無法保證在epoll_ctl()
之后您實際上不會收到任何東西,並且會同時執行最后一次read()
檢查和另一個線程再次喚醒同一fd的工作...
我猜每個fd都有一個鎖是可以接受的解決方案,但這是在邊緣觸發模式下“批准”使用epoll並在同一epollfd上輪詢多個線程嗎?
是的,您仍然需要進行適當的鎖定以防止遇到您描述的情況-並且,每fd使用鎖定是最明智的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.