gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:30 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com