免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4985 | 回复: 4
打印 上一主题 下一主题

有关libevent定时器的一点疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-06 01:52 |只看该作者 |倒序浏览
在libevent中,event_loop的流程是: 检测信号事件,检测超时事件,如果没有事件用距离下次超时的时间作为epoll_wait的超时阻塞调用epoll_wait,否则超时值为0.

问题来了,如果我开始的时候设置了一个超时时间为5秒的超时事件。并且在这5秒中,没有任何信号,其他的超时事件,任务读写事件等发生。在第3秒的时候,设置一个500毫秒的超时。libevent似乎无法在第3秒500毫秒左右返回这个超时事件。而且在libevent中,调用epoll_wait的最大超时值是(#define MAX_EPOLL_TIMEOUT_MSEC (35*60*1000))。

不知道没有什么解决办法.....

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2009-06-06 02:09 |只看该作者
估计是没有唤醒epoll_wait, 也就是没有注册上

论坛徽章:
0
3 [报告]
发表于 2009-06-06 04:13 |只看该作者
1.主程序事件框架main_base里建好各自任务的管道, 并注册这些任务管道的读事件, 用于接收管道里的定时通知.

2.在各自任务里新创建各自的event_base , 然后注册定时器事件, 定时器里注册的回调实现管道写通知, 用于通知主框架有子任务超时触发了

不知能否满足你的要求,
BTW, 可以看下基于libevent的应用, 如memcached, 或许能找到些灵感

论坛徽章:
0
4 [报告]
发表于 2012-11-30 19:50 |只看该作者
调用event_base_loopcontinue()试试

论坛徽章:
0
5 [报告]
发表于 2012-12-05 11:38 |只看该作者
回复 4# charlesymt

多线程中,libevent本身就处理这个问题。
  1. /* if we are not in the right thread, we need to wake up the loop */
  2.         if (res != -1 && notify && EVBASE_NEED_NOTIFY(base))
  3.                 evthread_notify_base(base);
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP