淺析muduo網(wǎng)絡(luò)庫之喚醒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內(nèi)置了一個wakeupChannel, 干嘛用的?

繼續(xù)看代碼


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個字節(jié),那這8個字節(jié)肯定要處理啊

找代碼看


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的原理

打賞

如果這篇文章解決了您的問題,讓我買根煙抽抽。

支付寶.jpg
微信.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容