問題情境
一般IO復用是使用 one loop per thread 的模型, 一般wait都是可讀事件,監聽可寫需實時添加,如果遇到wait線程在等待可讀事件,并一直阻塞下去, 卻有一個線程想添加監聽可寫事件,這時需要喚醒wait,并添加可寫事件。
解決方案
** 直接喚醒wait的方式就是可讀事件,那么只需要給wait一個可讀事件即可。**
因此epoll需要多監聽一個套接字作為喚醒wait的專用套接字,可以用pipe, 可以用其他的eventfd
以使用pipe為例。
開啟一個pipe,將讀端的套接字加入監聽紅黑樹,那么當需要喚醒使wait返回時,只需要想pipe寫端寫入數據即可。