項目中用到了libevent,我主要用他來管理網絡連接對象的讀寫事件、定時器事件。
有了libevent,對這類異步處理,確實增加了許多方便性,只需要在調用event_set時傳入自己的回調函數,自己就只需要安心睡大覺了(有事情時他會叫你的)。
可是,在后來項目復雜后,幾次發現項目陷入無響應狀態,也就是不崩潰,不報錯,不退出,但是也不響應事情!
這真是個令人抓狂的事情!要知道:在基本上所有的代碼都在我嚴密的TRY-CATCH天羅地網之下,但是這個罪魁禍首卻依然逍遙法外,還找不到絲毫蛛絲馬跡!

經過仔細的研究,終于發現端倪:程序陷入進了libevent的loop之中!
為什么會這樣了?
后來發現至少兩種情況導致了這個問題:
1、某個網絡連接對象已經正常或者異常close了,但是沒有調用event_del刪除這個對象,他還在libevent的鏈中輪詢;
2、因為libevent可以重復注冊event,所以在某種邏輯下,不小心多次注冊了某個event或者定時器后,libevent也可能會僵死。
另外,當時我希望能查看出錯以后的libevent內部情況,所以使用了他的event_base_dump_events函數,很可惜,這個dump能提供給我的實在是少得可憐而且簡單得基本沒有價值的信息。這個事實實在是讓我感到很遺憾。