簡體   English   中英

具有邊沿觸發,一發多線程的epoll

[英]epoll with edge triggering, one shot and multithreading

這是關於此答案的一個問題: https ://stackoverflow.com/a/14241095/2332808(會對此進行評論,但顯然無法創建新帳戶,對此感到抱歉。很難找到有關epollet /多線程的資源。 )

建議使用epoll如下:

  1. epoll_ctl()激活通知(如果使用EPOLLONESHOT則重新激活)。
  2. 系統輸入:循環read() / recv() / accept() ,直到錯誤EAGAIN為止。
  3. epoll_wait()接收通知。

但是,假設在同一epollfd上的epoll_wait()有多個線程,如果在完成讀取之前接收到更多的數據(例如,以兩個線程處理結束),則在同一fd上喚醒另一個線程不會冒此風險。相同的FD)

即使您將所有內容轉過來,然后將read()直到EAGAINepoll_ctl()然后再次調用read()來檢查仍然沒有任何內容(以避免在最后一次讀取到epoll_ctl()之間收到爭奪的情況)。 ..

但是仍然無法保證在epoll_ctl()之后您實際上不會收到任何東西,並且會同時執行最后一次read()檢查和另一個線程再次喚醒同一fd的工作...

我猜每個fd都有一個鎖是可以接受的解決方案,但這是在邊緣觸發模式下“批准”使用epoll並在同一epollfd上輪詢多個線程嗎?

是的,您仍然需要進行適當的鎖定以防止遇到您描述的情況-並且,每fd使用鎖定是最明智的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM