看书后的小总结
第一部分 Reactor模式的现代化实现
包括EventLoop Poller Channel TimerQueue EventLoopThread等class
1.1 EventLoop
- 创建了 EventLoop 对象的线程是 IO 线程,其主要功能是运行事件循环EventLoop::loop()
- EventLoop 的生命周期通常和所属线程一样长 , 它不必是 heap 对象
- 时间循环必须在IO线程中执行 EventLoop::loop()进行检查
- 每个线程至多有一个对象,那么可以让EventLoop的static成员函数getEventLoopOfCurrentThread()返回这个对象.
- 我们需要确定哪些线程是安全的,可以跨线程调用,哪些成员函数只能在某个特定线程中调用(主要是IO线程), 为了能在运行时检查,EventLoop 提供了isInLoopThread() 和 assertInLoopThread()等函数
1.2 Reactor核心事件分发机制
即将IO复用拿到的IO事件分发给各个文件描述符的事件处理函数
1.2.1 Channel class
- 每个 Channel 对象自始至中只属于一个EventLoop,因此每个Channel 对象只属于某一个IO线程
- 每个Channel 对象自始至终只负责一个文件描述符 fd 的 IO 事件分发,但它并不拥有,也不会在析构的时候关闭
- Channel 会把不同的 IO 事件分发给不同的回调
- 用户一般不直接使用 Channel , 而是使用更上层的封装,如TCPConnection
- 核心: Channel::handEvent() , 由EventLoop::loop()调用,它的功能是根据revent_ 的值分别调用不同的用户回调
1.2.2 Poller class
- 是IO复用的封装,现在是个具体类,但在muduo是个抽象基类
- 是 EventLoop 的间接成员,只供其owner EventLoop 在 IO 线程中调用,因此无需加锁
- 生命周期与 EventLoop 相等
- Poller 在析构前必须自己unregister , 避免空悬指针
- 核心 : Poller::poll() ,
1.2.3 TimerQueue 定时器
未完待续…