Muduo 学习笔记之Reactor框架源码解析

在上一篇博文中介绍了muduo的总体框架,本篇博文将会介绍Reactor的实现原理以及源码解析。在看本篇博文之前请先看上一篇博文——Reactor框架总览https://blog.csdn.net/qq_40832456/article/details/101718179

EventLoop

事件循环。moduo的线程模型为one loop per thread,即每个线程只能有一个EventLoop对象。EventLoop对象的生命周期通常和其所属的线程一样长。

源码剖析:

Muduo 学习笔记之Reactor框架源码解析
Muduo 学习笔记之Reactor框架源码解析
设计之初EventLoop里面成员很少,只有一个threadId_用于记住当前线程的tid,因为one loop per Thread的思想嘛,EventLoop主要用于确认只能有一个线程拥有它。包括里面loop()的内容都是空的。
在将Poller和Channel的功能基本完成后往EventLoop里面加了点东西:
Muduo 学习笔记之Reactor框架源码解析Muduo 学习笔记之Reactor框架源码解析
EventLoop::loop()里面也有了真正的内容,在此函数里面调用Poller::poll()函数监听客户端的读写事件,并且调用Channel的HandleEvent()也就是事件处理函数。在handleEvent函数里可能调用newconnetion()(新连接的时候,linsten fd 有可读事件)也可能调用用户的自定义回调函数。

Channel

Channel负责一个文件描述符的IO事件分发,并把不同IO事件分发不同的回调,例如ReadCallback,writeCallback()等。
数据成员:
int fd_文件描述符,

int events_ 文件描述符注册事件,

int revents_文件描述符的就绪事件,由Poller::poll设置

readCallback_,writeCallback…各种事件回调,会在拥有该Channel类的构造函数中被注册,例如TcpConnction会在构造函数中TcpConnection::handlRead()注册给Channel::readCallback

Poller

Poller是IO multiplexing的封装,封装了poll和epoll。Poller是EventLoop的间接成员,只供拥有该Poller的EventLoop在IO线程调用。生命期与EventLoop相等。
Muduo 学习笔记之Reactor框架源码解析

Muduo 学习笔记之Reactor框架源码解析
主要函数功能poll(被EventLoop调用),它调用poll(2)获得当前活动的IO事件,然后填充调用传入activeChannels,并返回poll(2)return的时刻。
Muduo 学习笔记之Reactor框架源码解析

fillActiveChannles()遍历监听的fd,找出有活动事件的fd,并把它的Channel填入ActiveChannels。
Muduo 学习笔记之Reactor框架源码解析
Muduo 学习笔记之Reactor框架源码解析
updateChannel()的主要功能是负责维护和更新pollfds_数组
Muduo 学习笔记之Reactor框架源码解析

至此,Reactor框架包含的主要成员类就分析完了。
Muduo 学习笔记之Reactor框架源码解析
现在看这张图是不是感觉清晰了不少了?