ACE5.5
現(xiàn)象:
一個正常的TCP連接,一段時間后client向server發(fā)送數(shù)據(jù)失敗——127.0.0.1的地址,連接未斷開,client日志顯示發(fā)送成功,而server的日志卻顯示未收到數(shù)據(jù)。
內部實現(xiàn):
client發(fā)送數(shù)據(jù)時首先將數(shù)據(jù)加入ACE_Message_Queue中,再使用reactor()->notify(this, ACE_Event_Handler::WRITE_MASK)進行發(fā)送(該過程正常執(zhí)行);在發(fā)送線程ACE_Task_Base的svc()中循環(huán)調用reactor()->handle_events()處理事件,在handle_output中調用send_n進行發(fā)送;程序沒有調用reactor()->register_handler注冊ACE_Event_Handler::WRITE_MASK事件。
跟蹤:
發(fā)現(xiàn)沒有回調handle_output()——是因為使用notify方式不能保證該函數(shù)被回調嗎?
嘗試加入ACE_Event_Handler::WRITE_MASK注冊。
犯錯了!線程被堵了。
本次問題在ASR時發(fā)生,以前發(fā)生過一次“是”在TTS時,考試大提示現(xiàn)象完全一樣——現(xiàn)在才發(fā)現(xiàn)其實上次的原因也是因為ASR造成的線程阻塞,難怪上次一直壓TTS問題也沒重現(xiàn)
現(xiàn)象:
一個正常的TCP連接,一段時間后client向server發(fā)送數(shù)據(jù)失敗——127.0.0.1的地址,連接未斷開,client日志顯示發(fā)送成功,而server的日志卻顯示未收到數(shù)據(jù)。
內部實現(xiàn):
client發(fā)送數(shù)據(jù)時首先將數(shù)據(jù)加入ACE_Message_Queue中,再使用reactor()->notify(this, ACE_Event_Handler::WRITE_MASK)進行發(fā)送(該過程正常執(zhí)行);在發(fā)送線程ACE_Task_Base的svc()中循環(huán)調用reactor()->handle_events()處理事件,在handle_output中調用send_n進行發(fā)送;程序沒有調用reactor()->register_handler注冊ACE_Event_Handler::WRITE_MASK事件。
跟蹤:
發(fā)現(xiàn)沒有回調handle_output()——是因為使用notify方式不能保證該函數(shù)被回調嗎?
嘗試加入ACE_Event_Handler::WRITE_MASK注冊。
犯錯了!線程被堵了。
本次問題在ASR時發(fā)生,以前發(fā)生過一次“是”在TTS時,考試大提示現(xiàn)象完全一樣——現(xiàn)在才發(fā)現(xiàn)其實上次的原因也是因為ASR造成的線程阻塞,難怪上次一直壓TTS問題也沒重現(xiàn)