Boost ASIO:从处理程序异常中恢复
Posted
技术标签:
【中文标题】Boost ASIO:从处理程序异常中恢复【英文标题】:Boost ASIO: recovering from handler exceptions 【发布时间】:2017-10-25 13:43:16 【问题描述】:如果 ASIO 回调抛出错误,恢复异步处理是否安全?
总之,下面的代码有什么可取之处吗?
void runAsioLoop()
boost::asio::io_service::work work(this->m_ioservice);
boost::system::error_code unused;
while (m_running)
try
this->m_ioService.run(unused);
this->m_ioService.reset();
catch (...)
std::cerr << "*** An error happened\n";
【问题讨论】:
【参考方案1】:应该可以,但更好的习惯用法是:
for (;;)
try
svc.run();
break; // exited normally
catch (std::exception const &e)
logger.log(LOG_ERR) << "[eventloop] An unexpected error occurred running a task: " << e.what();
catch (...)
logger.log(LOG_ERR) << "[eventloop] An unexpected error occurred running a task";
这是它的文档:http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/reference/io_service.html#boost_asio.reference.io_service.effect_of_exceptions_thrown_from_handlers
【讨论】:
感谢您的链接。如果 run() 无事可做,上面的代码示例不会导致 100% 的 CPU 使用率吗?我确实在自己的线程中运行每个 ioservice。 如果没有什么可以运行循环结束,就像正常的一样以上是关于Boost ASIO:从处理程序异常中恢复的主要内容,如果未能解决你的问题,请参考以下文章
从多个线程调用 boost::asio::io_service 运行函数