epoll的線程切換的問題?
12-30
比如我有這麼一個需求,有一個有鎖的隊列 主要用來做線程切換的。但是在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,以下兩件事情,哪一個更有意義?