muduo icon indicating copy to clipboard operation
muduo copied to clipboard

EventLoop在进入epoll_wait之前调runInLoop会导致这次事件没法达到预期执行效果

Open ColdV opened this issue 4 years ago • 2 comments

EventLoop在进入epoll_wait之前可以确定当前线程初始化完成,但是没有办法知道已经进入epoll_wait阻塞中, 如果此时在主线程中获取到了这个EventLoop并调用了runInLoop那么会发生的情况是:wakeup()并不会产生效果(因为EventLoop的线程此时还没有进入到epoll_wait中),这个事件(比如定时器事件)将会阻塞kPollTimeMs个时间,在下一帧中被执行. 虽然最终还是会被执行到,但是并不是预期结果(一秒的定时器,结果在10秒后被执行)。 我也正在尝试写一个网络库,所以有在学习muduo, 目前我比较头疼的问题是,我的epoll_wait时间并不是固定的,会根据当前的最近一个定时器的事件来计算epoll_wait的超时时间(如果没有那么就-1永久阻塞,或者被网络IO唤醒).换句话说假设kPollTimeMs是-1,出现我上述的情况时,定时器将永远不会被执行直到被网络IO唤醒。 请问 这种情况有什么比较好的解决方案没。 苦恼!!!!

ColdV avatar Jan 22 '21 14:01 ColdV

muduo 不会出现你说的情况,wakeup() 会正确地及时唤醒 epoll_wait()。 假设主线程和 EventLoop::loop() 位于两个线程,如果主线程调用了 EventLoop::runInLoop(),它会调用 EventLoop::wakeup(),往 wakeupFd_ 写一次数据。那么当 EventLoop 线程进入到 epoll_wait(2) 时,wakeupFd_ 是可读的,epoll_wait(2) 会立刻返回,并不会阻塞 kPollTimeMs 这么长的时间。

chenshuo avatar Jan 22 '21 22:01 chenshuo

已经解决了 是可以提前唤醒的 之前是我自己代码写的有点问题 尬!

ColdV avatar Jan 23 '21 08:01 ColdV