2

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

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

4

2 回答 2

1

然后我在我的 io_service 上调用 stop()

当您需要停止时,尝试使用此技巧(从io_service 文档io_service复制) :

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

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

于 2011-09-08T22:07:07.360 回答
0

stop()只是指示 io_service 停止。如果您使用另一个 run() 调用跟随 stop() 调用,它应该返回并正确清理。

在文档中有一些关于从处理程序中抛出异常的讨论。

我也猜测这个问题可能与某些对象生命周期问题有关,例如 io 服务被破坏,而其他东西仍在引用它。仔细查看示例以及如何使用共享指针来确保对象仍然存在。

于 2011-09-09T04:07:04.050 回答