EventLoop Class源码阅读

#EventLoop Class源码阅读

这部分有点复杂,欢迎大家交流

事件循环,服务器代码main函数最后的while循环。负责调用Poller监听触发的事件,调用Channel::handleEvent处理就绪的事件。

数据成员

  • bool looping_

是否正在进行事件循环,在构造函数中初始化为false,在EventLoop::loop()中初始化为true

  • bool std::atomic<bool> quit_;

原子型变量,初始化为false,EventLoop::loop()根据quit_决定是否停止循环。

  • bool eventHandling_

是否正在处理就绪事件

  • bool callingPendingFunctors_

是否正在运行functors中的函数

  • int64_t iteration_

EventLoop::loop()循环次数

  • const pid_t threadId_

当前EventLoop对象所处线程,当前线程即为 I / O 线 程 I/O线程 I/O线

  • Timestamp pollReturnTime_

应该是一个用于计时变量

  • std::unique_ptr<Poller> poller_;

EventLoop所绑定的 多 路 复 用 多路复用 对象,为什么要采用这种方式,采用unique_ptr有什么特别的意义吗?

  • int wakeupFd_

用于线程间通信的文件描述符,非EventLoop所在线程通过写该描述符通知 I / O 线 程 I/O线程 I/O线有事发生。

  • std::unique_ptr<Channel> wakeupChannel_

监视wakeupFd_Channel对象。

  • std::unique_ptr<TimerQueue> timerQueue_;

一组计时器

  • boost::any context_

这是干嘛的?存储对EventLoop对象的解释吗

  • std::vector<Channel*> activeChannels_

发生就绪事件的文件表

  • Channel* currentActiveChannel_

当前正在处理的事件

  • mutable MutexLock mutex_; std::vector<Functor> pendingFunctors_ GUARDED_BY(mutex_);

需要处理的函数和保护他的互斥锁。

函数成员

  • EventLoop();

构造函数,初始化相关变量,为wakeupFd_初始化描述符、绑定Channel、设置读监视和处理函数,检查当前线程是否有别的EventLoop对象。

  • void loop();

事件循环,调用Poller::poll等待就绪事件,对就绪事件调用Channel::handleEvent进行处理,在事件循环的最后执行pendingFunctors_中的函数(doPendingFunctors())

  • void quit();

设置quit_为true,如果当前线程不是 I / O 线 程 I/O线程 I/O线,就再向wakeupFd_写个 1 1 1void wakeup())。
问题(吴悠大佬):如果线程A刚刚设置quit_true,接着 I / O 线 程 I/O线程 I/O线就运行到判断quit_,然后析构自身。接着线程A继续运行EventLoop::isInLoopThread()访问了无效的对象
解决措施:1 在使用的时候,使用shared_ptr来封装EventLoop Class:在出现上述问题时,EventLoop::quit()停止循环, I / O 线 程 I/O线程 I/O线停止,该shared_ptr计数减一,但线程A的shared_ptr还在,不至于析构。

  • void runInLoop(Functor cb)

如果当前线程是 I / O 线 程 I/O线程 I/O线,则直接执行cb,否则将cb保存到pendingFunctors_中,并发 1 1 1 I / O 线 程 I/O线程 I/O线

  • void doPendingFunctors()

执行pendingFunctors_中的函数。

  • TimerId runAt(Timestamp time,TimerCallback cb)

注册一个计时器,在time时刻执行cb

  • TimerId runAfter(double delay,TimerCallback cb)

注册一个计时器,在delay时刻后执行cb

  • TimerId runEvery(double interval,TimerCallback cb)

注册一个计时器,每隔interval执行cb

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值