单线程Boost.Asio中poll()未执行post()任务的原因排查
问题解决与async_resolve()流程说明
一、post任务不执行的原因及解决
你遇到的核心问题出在io_context的状态逻辑上:
- 在
test()里直接调用poll()能执行任务,是因为post()提交任务后,io_context立即被唤醒,此时poll()会直接处理队列里的就绪任务。 - 把
poll()放到calledFromALoop()里任务不执行,大概率是**io_context已经进入停止状态**(比如之前调用过run()结束后没重启,或是误调用了stop())。处于停止状态的io_context,poll()会直接返回0,完全不处理任何任务。
解决办法:
- 在
calledFromALoop()调用poll()前,先检查io_context是否停止,若是则调用m_io_context.restart()重置状态; - 确保整个流程中,不要在非必要场景调用
io_context::stop(),避免让它进入停止状态。
补充:如果你的io_context没有绑定io_context::work,这只会影响run()是否自动退出,不会干扰poll()处理任务,所以不用纠结这个点。
二、async_resolve()的执行步骤
async_resolve()的完整流程可以拆成三步:
- 请求初始化:调用
async_resolve()时,asio会立刻完成参数构造、回调绑定等初始化工作,然后把异步解析请求提交给底层机制(可能是系统提供的异步DNS接口,也可能是asio自身模拟的异步逻辑)。 - 后台解析阶段:底层开始处理DNS解析,这一步是异步执行的,不会阻塞当前线程。
- 回调触发:当解析完成(成功或失败),asio会把对应的回调任务标记为就绪状态。此时调用
poll()或run(),就会从io_context的队列中取出回调并执行。
简单总结:async_resolve()只是发起请求,真正的解析在后台运行,等结果出来后,poll()会触发你绑定的回调函数执行。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

