c++ - 抛出 io_service::run() 后,boost::asio 在解析器服务析构函数中挂起

标签 c++ boost boost-asio resolver

我使用的是相当简单的 boost::asio 设置,我从主线程调用 io_service.run()。 我有一个 tcp 解析器,并使用异步解析来查找地址。 当查找失败时,我在异步回调中抛出一个异常。 我在主函数内的 run() 调用之外捕获了这个异常。然后我在我的 io_service 实例(这是一个全局的)上调用 stop() 。 但是,当 main() 返回时,程序挂起。原来是在等待一个永远不会来自解析器服务的 exit_event_。

我不想在退出时挂起。我做错了什么吗?如果是这样,什么?我在网上没有发现太多关于这些事情的讨论。 我在 Windows 7/64 位上使用 boost 1.41.0。

最佳答案

I then call stop() on my io_service

当你需要停止 io_service 时尝试使用这个技巧(从 io_service documentation 复制):

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()调用尽快返回,放弃未完成的操作,并且不允许准备好要 dispatch 的处理程序。

因此,如果您需要分派(dispatch)所有处理程序,调用 io_service::stop() 是不够的。

关于c++ - 抛出 io_service::run() 后,boost::asio 在解析器服务析构函数中挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3324293/

相关文章:

c++ - 使用 Boost::program_options 允许多次出现自定义类型

c++ - Boost.Asio 文档不存在。这些错误是什么意思?

c++ - boost::asio sleep 替代品?

c++ - 为什么这行得通? (多重继承,切片)

c++ - 输出比多态文本文件更多的东西

c++ - 另一个 C++ 输出对齐问题

c++ - boost::asio::ip::tcp::resolver::resolve() 永远阻塞

c++ - 我如何只使用 Boost 库的 Asio?

c++ - 解包 std::reference_wrapper 的成本

c++ - 在C++中将函数返回类型指定为模板参数