2013-09-26 108 views
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。

回答

2

如果沒有更多工作要做,io_service會自行停止;這可能是這裏發生的事情。如果你想阻止這種情況,你可以通過創建一個io_service::work對象來實現。只要該對象存在,io_service就不會停止。

+0

天哪!你是對的!我沒有注意到在處理程序_before_中引發異常,它可能會向io_service添加其他工作(通過「鏈接」以下處理程序),因此退回到catch塊中,因爲它停止工作,因此io_service已停止。我可以重新排列操作,以便在將代碼添加到io_service後添加工作,但這很脆弱並且難以維護,所以我將去尋找io_service :: work路線。 – abigagli

+0

「只要該對象存在,'io_service'不會自行停止。」根本不是真的。無論工作對象是否存在,如果調用'io_service-> stop();',io_service也會停止。 – Kenji

相關問題