別的不看,看代碼
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