muduo源码分析---EventLoop类

时间:2021-08-11 00:17:48
现在暂时记住TcpConnection是TcpServer中Acceptor关注的监听套接字上accept新连接后被初始化的一个对象,接下来分析下EventLoop         这个东西才是真正驱动库的核心,是别的类(EpollPoller Acceptor )帮助他完成了库的功能,看看内部是怎么实现的。 EventLoop:         这个类中最重要的成员就是poller_,这个成员调用epoll_wait监听这个EventLoop所关注的所有套接字,poller_在这里的作用就是:当其返回时,activeChannel_内是所有有事件的Channel,然后就调用Channel中的handleEvent()即可。         而updateChannel和removeChannel就是和向EventList(这个成员在poller_中)添加删除某一个Channel(虽说Channel不拥有socketfd,但是Channel和某个特定的socketfd进行绑定)。         内部还有一个wakeupFd_,这是为了异步唤醒而存在的socketfd,线程间同行可以使用eventfd产生的socketfd,wakeupFd_就是这样的套接字(想下muduo的默认模型就明白这个套接字存在的意义了)。与这个套接字相关联的Channel就是wakeupChannel_。         其他也有和Timer相关的函数和成员变量,这里暂时不分析。         还有几个重要的标志位:         looping_ 标志是否继续loop,进入loop()函数就将此值赋值为true,退出loop循环为false         quit_,标志是否退出loop循环         eventHandling_          在处理activeChannel_链表中的事件的过程中,此值为true,activeChannel_链表中的事件执行结束后,此值为false。存在的意义是在removeChannel函数中,删除某一个Channel,需要判断此值,如果为true,那么当前需要删除的事件不要在activeChannel_链表中并且当前正在处理的事件currentActiveChannel_不能是想要删除的Channel。         首先如果保证需要删除的Channel不在activeChannel_中,而currentActiveChannle_ == channel 是为了保证channel不为NULL,其实第一条就已经保证了Channel不用误删,在正在处理当前activeChannels_的前后一个阶段currentActiveChannel_都为NULL         callingPendingFunctors_         timerQueue_         wakeupFd_         wakeupChannel_         currentActiveChannel_ 在loop()函数中,调用poller_的poll函数,可以获得所有存在事件组成的一个链表,链表中的元素为Channel,链表为activeChannel。这个函数就是通过poller_得到一个激活事件的链表,然后再回调各个Channel中的事件处理回调         isInLoopThread():         判断当前线程是否为此EventLoop所在的线程。         quit()         瑞出循环函数(这个循环就是loop中的while循环)如果这个EventLoop不在当前线程,就用wakeup异步唤醒         runInLoop()         如果EventLoop属于当前线程,直接调用回调         如果不在一个线程,添加到队列中(pendingFunctors_),然后唤醒调用的线程!                  在runInLoop函数中,添加回调想这个EventLoop中,如果当前线程属于EventLoop所属的线程,那么直接执行注册的回调,如果不在同一个线程,那么存放到队列中,然后唤醒线程,唤醒线程的意思就是让poll返回,只要poll将返回,就可以按序执行向量中注册的回调(执行的函数是doPendingFunctors(),如果在doPendingFunctors函数正在执行的过程中又通过queueInLoop注册了新的函数,那么在此wakup)     举例说明:         比如在threadA中创建了一个EventLoop event_threada,虽说在这个线程创建且在这个线程中使用,但是在线程threadB中使用,且注册了一个回调,那么让threadA去处理
(未完待续)