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 运行函数

Boost::Asio - 抛出 get_io_service 异常

boost asio 学习 错误处理

boost asio 接收数据异常 $/x1

关于何时在 Boost.Asio 中调用处理程序

使用 boost::asio 获取 UDP 套接字远程地址