天天看點

muduo源碼分析:reactor模型封裝

muduo源碼分析:reactor模型封裝

圖中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它不管理

muduo源碼分析:reactor模型封裝

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

muduo源碼分析:reactor模型封裝

參考:c++教程網

           muduo網絡庫

           linux多線程伺服器端程式設計 .陳碩

繼續閱讀