簡體   English   中英

boost :: asio退出io_service :: run()后掛在解析程序服務析構函數中

[英]boost::asio hangs in resolver service destructor after throwing out of io_service::run()

我正在使用一個相當簡單的boost :: asio設置,在這里我從主線程調用io_service.run()。 我有一個TCP解析器,並使用異步解析來查找地址。 當查找失敗時,我在異步回調內拋出異常。 我在main函數內的run()調用之外捕獲了此異常。 然后,我在io_service實例(全局)上調用stop()。 但是,當main()返回時,程序將掛起。 事實證明,它正在等待一個永不來自解析程序服務的exit_event_。

我不想掛在出口上。 我做錯了什么嗎? 如果是這樣,該怎么辦? 我沒有在網上找到關於這些事情的太多討論。 我在Windows 7 / 64bit上使用boost 1.41.0。

然后,我在io_service上調用stop()

需要停止io_service時,嘗試使用此技巧(從io_service文檔復制):

boost::asio::io_service io_service;
auto_ptr<boost::asio::io_service::work> work(
    new boost::asio::io_service::work(io_service));
...
work.reset(); // Allow run() to exit. 

原因很簡單(同樣來自文檔):調用io_service::stop()將導致io_service run()調用盡快返回,放棄未完成的操作,並且不允許分派就緒的處理程序。

因此,如果您需要分派所有處理程序,僅調用io_service::stop()是不夠的。

stop()只是通知io_service停止。 如果在stop()調用之后執行另一個run()調用,則它應該返回並正確清理。

文檔中有一些關於從處理程序引發異常的討論。

我還猜測這個問題可能與某些對象生存期問題有關,例如io服務被銷毀,而其他東西仍在引用它。 請仔細查看示例,以及如何使用共享指針來確保對象仍然存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM