2
雖然提升文檔說您是否需要在處理程序拋出異常後重置asio :: io_service?
的異常被抓後,run()中,run_one(),輪詢()或 poll_one()調用,可以無需介入 呼叫復位重新啓動()
我有不同的經歷。
在異常處理程序中,我發現io_service處於停止狀態,並且事實上任何後續嘗試添加異步工作都失敗,因此以下run()調用立即退出。
這是非常相似,我在做什麼:
...
io_service ios;
do_receive(); // adds some async work to ios
do try
{
ios.run();
break;
}
catch (std::exception const &)
{
assert (ios.stopped()); //<----- ASSERTION DOESN'T TRIGGER. i.e ios is stopped
ios.reset(); //<----- ...So I need to do this otherwise next call
//<----- to do_receive() fails to add more async work
//<----- causing next loop iteration's run() invocation
//<----- to exit immediately
do_receive(); //same as above, adds async work to ios
}
while(1);
添加呼叫嘗試添加新的異步工作似乎已經解決了這個問題之前,io_service對象的reset()方法,但我看不到在我有幾個線程調用run()的情況下,這將如何擴展。
如果有任何處理程序拋出,catch塊會在該線程上下文中調用重置,我猜這會嚴重干擾所有其他正在運行的操作。
我做錯了什麼或錯過了助推器文檔中的東西?
謝謝, Andrea。
天哪!你是對的!我沒有注意到在處理程序_before_中引發異常,它可能會向io_service添加其他工作(通過「鏈接」以下處理程序),因此退回到catch塊中,因爲它停止工作,因此io_service已停止。我可以重新排列操作,以便在將代碼添加到io_service後添加工作,但這很脆弱並且難以維護,所以我將去尋找io_service :: work路線。 – abigagli
「只要該對象存在,'io_service'不會自行停止。」根本不是真的。無論工作對象是否存在,如果調用'io_service-> stop();',io_service也會停止。 – Kenji