我使用的是相当简单的 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/