作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用的是相当简单的 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/
我是一名优秀的程序员,十分优秀!