boost::asio異步基于完成埠實作的一套開源的網路框架,但是在程式關閉時遇到的了一些問題,不知各位大俠有沒有了解相關知識,問題如下:
目前采用先關閉socket,再關閉io_service的方式
1、如果io_service呼叫stop之后直接銷毀,會有概率出現例外,大概的意思就是作業者執行緒還未退出的情況下,io_service被銷毀了。但是目前沒有找到對應可以控制相關順序的方式,作業者執行緒不只一個。
2、socket如果呼叫async_connect后,呼叫socket.cancel()和socket.close()后,實際并未立馬中止鏈接,實際上作業者執行緒需要等待超時或者中斷回傳,此次的async_connect才算執行完畢,有沒有其他的關閉方式,能更快或者能控制時序的方式進行關閉?
望指教~~
uj5u.com熱心網友回復:
你需要先退出執行緒,等待所有的作業執行緒結束,然后銷毀執行緒使用的資源uj5u.com熱心網友回復:
就是作業者執行緒退出這點就很難判斷。。。目前沒找到合適的方式。
uj5u.com熱心網友回復:
萬事開頭難。依我看,萬事優雅地結束也難。
uj5u.com熱心網友回復:
要讓作業者執行緒結束其實很簡單,Post以一個自定義的事件進去就可以了。難處理的是,很多已經投遞(read和write)下去的操作還么有回傳,你就讓作業者執行緒退出了,
后續的記憶體處理可能會帶來程式的崩潰。
uj5u.com熱心網友回復:
哈哈。。。是啊,想優雅的關閉也難。。。
uj5u.com熱心網友回復:
post進去也只是post到其中一個作業者執行緒。并不能確保所有作業者執行緒都處于空閑狀態。 很多投遞的操作,可以中止掉,不過都是異步的,需要等待。 就是這個等待的時間就不是很好確定。暴力的辦法就是固定sleep一段時間等待他們退出。
uj5u.com熱心網友回復:
啟動了幾個worker難道不記錄?啟動了幾個worker就post幾個事件進去,是能夠確保worker都會正常退出的,但是是不是空閑就無法保證了。
不管是CloseHandle或者CloseSocket或者CancelIo引起的撤銷IO事件,在高IO的情況下,回傳時間都是很慢的,3、5秒到十多秒都是經常出現的,尤其是在多連接和高PPS的情況下,這種回傳等待時間就更長,Sleep可能不會幫助你解決記憶體被鎖定引起的Crash問題,參考計數應該是你需要考慮的方向。
uj5u.com熱心網友回復:
作業執行緒的退出為什么難判斷,根據執行緒創建回傳的handle來判斷就可以了啊uj5u.com熱心網友回復:
加1層能解決1切。
要讓作業者執行緒結束其實很簡單,Post以一個自定義的事件進去就可以了。
難處理的是,很多已經投遞(read和write)下去的操作還么有回傳,你就讓作業者執行緒退出了,
后續的記憶體處理可能會帶來程式的崩潰。
post進去也只是post到其中一個作業者執行緒。并不能確保所有作業者執行緒都處于空閑狀態。 很多投遞的操作,可以中止掉,不過都是異步的,需要等待。 就是這個等待的時間就不是很好確定。暴力的辦法就是固定sleep一段時間等待他們退出。
啟動了幾個worker難道不記錄?啟動了幾個worker就post幾個事件進去,是能夠確保worker都會正常退出的,但是是不是空閑就無法保證了。
不管是CloseHandle或者CloseSocket或者CancelIo引起的撤銷IO事件,在高IO的情況下,回傳時間都是很慢的,3、5秒到十多秒都是經常出現的,尤其是在多連接和高PPS的情況下,這種回傳等待時間就更長,Sleep可能不會幫助你解決記憶體被鎖定引起的Crash問題,參考計數應該是你需要考慮的方向。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/110990.html
標籤:基礎類
上一篇:CDHtmlDialog 在加載本地的 html時,jquery的庫不能用,在瀏覽器中頁面顯示正常
下一篇:通訊IP
