别的不看,看代码
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
的原理
打赏
如果这篇文章解决了您的问题,让我买根烟抽抽。