C++基礎(一個ACE問題解決方法)

字號:

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)