[英]Unable to catch exception from boost::asio::io_service::run
[英]Boost asio io_service run exception adn restart from multiple threads
我想知道在來自多個線程的 io_context 上使用 boost asio 的 run() 函數時在處理函數中拋出異常時會發生什么。 我在 io_context 上調用 run 操作的線程函數如下所示:
while(!io->stopped() && *stop == false) {
try {
auto cnt = io->run();
}catch(std::exception &e) {
}
if(io->stopped()) {
break;
}
}
線程數為1..N。 文檔指出,對 run() 的任何后續調用都必須先調用 restart() 但當仍有對 run() 的任何活動調用時不得調用 restart() 我不知道,因為可能仍有線程在調用 run ()。
當只有一個 io_context 和許多線程調用 run() 時,有什么解決方案
你是對的,你需要捕捉/處理異常。
解決您的難題的方法非常簡單:實際上不應在循環中調用run()
。 這種認識很有幫助,因為它讓您意識到一旦run();
正常退出,你可以隨時break;
.
更籠統地說,您還可以檢查run/poll{*}
成員函數的返回值:如果它返回零,則表示服務無法工作。
正常退出run
需要調用重新啟動,以便后續調用run
不會立即返回。 拋出異常不是正常的退出,所以立即再次調用run
是可以的。
您的代碼可能只是:
while(true) {
try {
auto cnt = io->run();
break;
}catch(std::exception &e) {
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.