You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Boost::ASIO多次调用async_resolve阻塞,事件处理器无响应求助

Boost::ASIO重复async_resolve挂起问题的排查与解决

核心原因与解决方案

1. Resolver未重置/取消未完成操作

Boost ASIO的tcp::resolver对象在存在未完成的异步resolve操作时,直接再次调用async_resolve会导致内部状态冲突,进而引发后续操作挂起。你可以通过两种方式解决:

方式一:取消未完成的resolve操作

在发起新的resolve请求前,调用cancel()终止所有未完成的异步操作,此时之前的回调会以boost::asio::error::operation_aborted错误码触发,你可以在回调中处理该错误并清理状态:

// 再次发起resolve前取消旧操作
if (hostResolver) {
    hostResolver->cancel();
}
// 发起新的resolve请求
hostResolver->async_resolve(boost::asio::ip::tcp::v4(), newHostName, newPortString,
    boost::bind(&DTcpSocket::resolveFinished, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator));

方式二:每次创建新的Resolver实例

避免复用同一个resolver对象,每次resolve前销毁旧实例并创建新对象(注意内存管理,防止泄漏):

// 清理旧的resolver
if (hostResolver) {
    delete hostResolver;
    hostResolver = nullptr;
}
// 创建新resolver并发起请求
hostResolver = new boost::asio::ip::tcp::resolver(*internalEventPump->getIoService());
hostResolver->async_resolve(boost::asio::ip::tcp::v4(), hostName, portString,
    boost::bind(&DTcpSocket::resolveFinished, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator));

2. 检查Io_service运行状态

确认internalEventPump->getIoService()返回的io_service是否持续正常运行:如果io_service被停止或阻塞,所有后续异步操作的回调都无法触发。确保事件循环(比如io_service.run())一直在后台运行,没有被意外终止。

3. 迭代器资源清理

你的resolveFinished回调中只处理了第一个端点并移动了迭代器,建议在发起新resolve前重置endPointIter等相关状态,避免上下文混乱导致的隐性问题。

内容的提问来源于stack exchange,提问作者Ebonair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:16:05