EventLoop可以在他的IO线程中执行某个用户任务回调,即
EventLoop::runInLoop(const Functor& cb)
其中Functor是boost::function<void()>。
如果用户在当前IO线程中调用这个函数,回调会同步进行;如果用户在其他线程调用runInLoop,cb会被加入队列,IO线程会被唤醒来调用这个Functor
针对这点,我们来看看EventLoop的Loop函数
void EventLoop::runInLoop(Functor&&cb)
{
if(isInLoopThread())
cb();
else
queueInLoop(std::move(cb));
}
void EventLoop::queueInLoop(Functor&&cb)
{
{
MutexLockGuard lock(mutex_);
pendingFunctors_.emplace_back(std::move(cb));
}
if(!isInLoopThread()||callingPendingFunctors_)
wakeup();
}
void EventLoop::loop()
{
assert(!looping_);
assert(isInLoopThread());
looping_=true;
quit_=false;
std::vector<SP_Channel>ret;
while(!quit_)
{
ret.clear();
ret=poller_->poll();
eventHandlding_=true;
for(auto & it :ret)
it->ha