目录
1、概述
mainReactor就是我们代码中的mainloop(baseloop),subReactor是我们代码中的工作线程进行读写事件的处理,读数据(read)是底层做的,decode是我们自己做的。compute和encode也是我们自己做的。从网络上read数据,然后从网络上send数据,这些是由muduo库帮我们做的。decode compute encode是我们用户在OnMessage处理的业务逻辑。每一个loop对应一个线程,每一个线程都是一个独立的Reactor。
2、Channel+Poller
看一下channel的成员变量:
channel主要做的事情是:
封装了fd,events和revents,还有一组回调方法。
- fd就是表示要往poller上注册的文件描述符
- events就是事先设置的fd所感兴趣的事件(读事件或者写事件)
- revents就是poller最终给我们channel通知的这个fd上发生的事件,channel根据相应的发生的事件来执行相应的回调。
对于上层来说,如果有一个fd的话,它就会把fd打包成channel通道,然后下发到poller上。
看一下poller的成员变量:
poller有一个成员变量channels,是一个map表,键就是channel打包的sockfd,值就是包含fd对应的channel,也就是说如果poller检测到哪个fd有事件发生了,就可以通过发生事件的fd和这个map表,找到这个fd对应的channel,这个channel里面就记录着详细的对应事件的回调方法。
但是channel和poller是独立的,它们是不能直接互相通信的,它们都是依赖Eventloop来通信的。
不管是channel还是poller,都有一个成员变量记录它所在的事件循环(loop成员变量)。