Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
ColdV opened this issue Jan 22, 2021 · 2 comments

Comments

@ColdV
Copy link

ColdV commented Jan 22, 2021

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

@chenshuo
Copy link
Owner

chenshuo commented Jan 22, 2021

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

@ColdV
Copy link
Author

ColdV commented Jan 23, 2021

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants