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

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