本文主要是介绍muduo网络库学习之EventLoop(一):事件循环类图简介和muduo 定时器TimeQueue,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、EventLoop、Channel、Poller 等类图如下:
黑色菱形:组合;白色菱形:聚合;白色三角形:继承;实线:关联;
Channel是selectable IO channel,负责注册与响应IO 事件,它不拥有file descriptor。
Channel是Acceptor、Connector、EventLoop、TimerQueue、TcpConnection的成员。
Channel是Acceptor、Connector、EventLoop、TimerQueue、TcpConnection的成员。
一个EventLoop对象对应一个Poller成员对象,boost::scoped_ptr<Poller> poller_;
//Poller是个抽象类,具体可以是EPollPoller(默认) 或者PollPoller
Poller类里面有三个纯虚函数,需要子类实现:
C++ Code
1 2 3 4 5 6 7 8 9 10 11 | /// Polls the I/O events. /// Must be called in the loop thread. virtual Timestamp poll( int timeoutMs, ChannelList *activeChannels) = 0; /// Changes the interested I/O events. /// Must be called in the loop thread. virtual void updateChannel(Channel *channel) = 0; /// Remove the channel, when it destructs. /// Must be called in the loop thread. virtual void removeChannel(Channel *channel) = 0; |
对于PollPoller来说,一个fd对应一个struct pollfd(pollfd.fd),一个fd 对应一个channel*;这个fd 可以是socket, eventfd, timerfd, signalfd; 如下:
C++ Code
1 2 3 4 | typedef std::vector< struct pollfd> PollFdList; typedef std::map< int, Channel *> ChannelMap; // key是文件描述符,value是Channel* PollFdList pollfds_; ChannelMap channels_; |
对于EPollPoller 来说,一个channel* 对应一个fd, 一个channel* 对应一个struct epoll_event(epoll_event.data.ptr)
C++ Code
1 2 3 4 | typedef std::vector< struct epoll_event> EventList; typedef std::map< int, Channel *> ChannelMap; EventList events_; ChannelMap channels_; |
一个线程最多只能有一个EventLoop对象,这种线程被称为IO线程。一个EventLoop对象对应多个Channel对象,但只有wakeupChannel_生存期由EventLoop控制 , timerfdChannel_生存期由TimeQueue管理。
(boost::scoped_ptr<Channel> wakeupChannel_; // 纳入poller_来管理 int wakeupFd_; // eventfd函数创建 )
其余以Channel* 方式管理,如下:
C++ Code
1 2 | typedef std::vector<Channel *> ChannelList; ChannelList activeChannels_; // Poller返回的活动通道 |
下面是Channel 类简化:
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
这篇关于muduo网络库学习之EventLoop(一):事件循环类图简介和muduo 定时器TimeQueue的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!