epoll的線程切換的問題?

比如我有這麼一個需求,有一個有鎖的隊列 主要用來做線程切換的。但是在IO線程用了epoll來做fd的維護,但是epoll_wait 是同步阻塞的,這樣如何使得epoll_wait 可以在隊里有數據的時候可以被喚醒??


參見 memcached或者muduo的做法。

muduo 原作者已經說過了,我就說說memcached的。

其實很簡單,創建一個pipe,然後把pipe的read端加入到epoll_wait的隊列裡面,當某個線程從write端寫數據,然後就喚醒epoll_wait了。


muduo/EventLoop.cc at master · chenshuo/muduo · GitHub


用eventfd 當隊列有數據時 對eventfd寫數據 喚醒epoll_wait


使用eventfd,不僅能wakeup,還能傳遞當前queue的長度。


最簡單的辦法就是建立一個管道,epoll監聽讀端,每次添加任務時就在寫端寫入幾個位元組。


參考libevent eventfd,pipe,winsock情況都考慮到了


一種辦法是用pipe來當作隊列,epoll可以監聽pipe_fd;如果隊列是自己寫的,那就多加一個多線程吧。我也是小白,想聽聽大牛是怎麼處理的。


推薦閱讀:

C 如何編譯出一個不需要操作系統的二進位?
如何看待 Linux 內核開發者 Sarah Sharp 宣布退出?
Linux 對比 Windows 能如何提高生產力?
Linux一定比win好嗎?為什麼我身邊的linux用戶勸說win和linux雙系統用戶放棄win?
對於將來想從事內核級開發的coder,以下兩件事情,哪一個更有意義?

TAG:操作系統 | Linux | epoll | 多線程 | 線程 |