
圖中FileDescriptor、socket都不是類
EventLoop:loop --》poller::loop --》pollPoller ::loop 或者epollpoller::poll,循環等待io事件發生,發生後Eventloop得到activeChannels_ 活動通道(儲存了發生的事件與回調處理函數),并調用該事件的回調處理函數(活動通道channel中注冊的回調處理函數,Eventloop::loop中隻能處理短時間回調函數,如果時長時間的應該加入都工作線程池來處理)
EventLoop中絕大數成員方法都要求在本io線程中調用,不支援跨線程調用。
poller是抽象類,pollpoller和epollpoller 是其子類,實作poll(),updateChannel(),和 removeChannel() 三個純虛函數。
channel類:檔案描述符和要關注事件和傳回事件、事件發生時的回調函數注冊 的封裝
eventloop中隻有一個 boost::scoped_ptr<Channel> wakeupChannel_ 要管理其生存期
typedef std::vector<Channel*> ChannelList; ChannelList activeChannels_; activeChannels_中的活動channel的生存期 eventloop它不管理
Channel是Acceptor、Connector、TimerQueue、TcpConnection的成員,生命期由後者控制
Acceptor、Connector等調用channel的
void enableReading() { events_ |= kReadEvent;update(); }
void enableWriting() { events_ |= kWriteEvent;update(); }
void disableWriting() { events_ &= ~kWriteEvent;update(); }
void disableAll() { events_ = kNoneEvent;update(); }
void remove( );
來更新,删除channel .
channel::update 和remove --》EventLoop::updateChannel(),和 removeChannel() --》poller::updatchannel和removeChannel --》epollpoller或者pollpoller 的updateChannel和removeChannel
參考:c++教程網
muduo網絡庫
linux多線程伺服器端程式設計 .陳碩