浅析muduo网络库之唤醒EventLoop

别的不看,看代码

EventLoop::EventLoop()
    wakeupFd_(createEventfd()),
    wakeupChannel_(new Channel(this, wakeupFd_)),
{
  wakeupChannel_->setReadCallback(
      boost::bind(&EventLoop::handleRead, this));
  // we are always reading the wakeupfd
  wakeupChannel_->enableReading();
}

代码看完了,EventLoop内置了一个wakeupChannel, 干嘛用的?

继续看代码


void EventLoop::wakeup()
{
  uint64_t one = 1;
  ssize_t n = sockets::write(wakeupFd_, &one, sizeof one);
  if (n != sizeof one)
  {
    LOG_ERROR << "EventLoop::wakeup() writes " << n << " bytes instead of 8";
  }
}

wakeup()往wakeupFd_写了8个字节,那这8个字节肯定要处理啊

找代码看


void EventLoop::handleRead()
{
  uint64_t one = 1;
  ssize_t n = sockets::read(wakeupFd_, &one, sizeof one);
  if (n != sizeof one)
  {
    LOG_ERROR << "EventLoop::handleRead() reads " << n << " bytes instead of 8";
  }
}

在这边处理了,只是简单读取了一下。貌似没啥用

解释还得看代码


void EventLoop::loop()
{
  while (!quit_)
  {
     pollReturnTime_ = poller_->poll(kPollTimeMs, &activeChannels_);
      //.......
     doPendingFunctors();
  }

poll返回的条件是啥?

出事了

看懂了代码

如果一直没有事情,poll不会返回。但是这时候有事情做,必须让poll返回,因此需要出点事情给poll,也就是wakup()。

这就是queueInLoop的原理

打赏

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

浅析muduo网络库之唤醒EventLoop_第1张图片
支付宝.jpg
浅析muduo网络库之唤醒EventLoop_第2张图片
微信.jpg

你可能感兴趣的:(浅析muduo网络库之唤醒EventLoop)