美文网首页浅析muduo网络库
浅析muduo网络库之定时任务EventLoop

浅析muduo网络库之定时任务EventLoop

作者: 谢昆明 | 来源:发表于2018-01-09 22:25 被阅读37次

    上代码

    EventLoop::EventLoop()
        timerQueue_(new TimerQueue(this)),
    }
    

    EventLoop内置了一个定时器队列timerQueue_

    定时器任务

    
    TimerId EventLoop::runAt(const Timestamp& time, const TimerCallback& cb)
    {
      return timerQueue_->addTimer(cb, time, 0.0);
    }
    

    看看TimeQueue的构造函数声明

    class TimerQueue : boost::noncopyable
    {
      explicit TimerQueue(EventLoop* loop);
    };
    

    传递了一个EventLoop进去,可以猜测定时任务是在EventLoop里面执行的

    看看TimerQueue的构造函数实现

    TimerQueue::TimerQueue(EventLoop* loop)
      : loop_(loop),
        timerfd_(createTimerfd()),
        timerfdChannel_(loop, timerfd_)
    {
      timerfdChannel_.setReadCallback(
          boost::bind(&TimerQueue::handleRead, this));
    }
    

    不出所料,创建了timerfd_timerfdChannel_,有回调函数是handleRead

    那应该在handleRead调用定时任务

    void TimerQueue::handleRead()
    {
    
    
      readTimerfd(timerfd_, now);
    
      //.........
      for (std::vector<Entry>::iterator it = expired.begin();
          it != expired.end(); ++it)
      {
        it->second->run();
      }
    
    }
    

    这个run()其实是Timer::run()

    class Timer
    {
      void run() const
      {
        callback_();
      }
    }
    

    打赏

    如果这篇文章解决了您的问题,让我买根烟抽抽。

    支付宝.jpg 微信.jpg

    相关文章

      网友评论

        本文标题:浅析muduo网络库之定时任务EventLoop

        本文链接:https://www.haomeiwen.com/subject/nvagnxtx.html