项目中用到了libevent,我主要用他来管理网络连接对象的读写事件、定时器事件。
有了libevent,对这类异步处理,确实增加了许多方便性,只需要在调用event_set时传入自己的回调函数,自己就只需要安心睡大觉了(有事情时他会叫你的)。
可是,在后来项目复杂后,几次发现项目陷入无响应状态,也就是不崩溃,不报错,不退出,但是也不响应事情!
这真是个令人抓狂的事情!要知道:在基本上所有的代码都在我严密的TRY-CATCH天罗地网之下,但是这个罪魁祸首却依然逍遥法外,还找不到丝毫蛛丝马迹!
经过仔细的研究,终于发现端倪:程序陷入进了libevent的loop之中!
为什么会这样了?
后来发现至少两种情况导致了这个问题:
1、某个网络连接对象已经正常或者异常close了,但是没有调用event_del删除这个对象,他还在libevent的链中轮询;
2、因为libevent可以重复注册event,所以在某种逻辑下,不小心多次注册了某个event或者定时器后,libevent也可能会僵死。
另外,当时我希望能查看出错以后的libevent内部情况,所以使用了他的event_base_dump_events函数,很可惜,这个dump能提供给我的实在是少得可怜而且简单得基本没有价值的信息。这个事实实在是让我感到很遗憾。