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

为何Boost.Asio io_service第二次调用run()不处理post的处理器?

问题原因及解决方案

这个问题的核心是Boost.Asio的io_service在第一次run()执行完毕后会进入「停止状态」,如果不重置这个状态,后续调用run()会直接返回,不会处理新提交的任务。

具体原因拆解

当你第一次调用io.run()时,它会处理所有已提交的任务,直到任务队列空了为止。此时io_service会自动触发停止逻辑,把自己标记为停止状态。这时候哪怕你再用post()提交新任务,任务确实会被加入队列,但再次调用run()时,因为服务已经处于停止状态,它不会启动新的事件循环,直接就返回了,所以第二个lambda永远不会被执行。

修复方法

在第二次调用run()之前,你需要调用io_service::reset()方法,把服务的状态重置为未停止,这样run()才会再次启动事件循环处理新任务。

修改后的代码如下:

#include <iostream>
#include <boost/asio.hpp>
int main() {
    boost::asio::io_service io;
    io.post([]{ std::cout << "Hello";});
    io.run();
    
    // 重置io_service状态,让后续run()能正常工作
    io.reset();
    
    io.post([]{ std::cout << ", World!" << std::endl; });
    io.run();
}

额外说明

如果你需要反复执行这样的「提交一组任务→运行完成→再提交」的逻辑,记得每次run()结束后都要调用reset()。另外,也可以用io_service::run_one()或者io_service::poll()来控制任务执行的方式,但在你的场景下,reset()配合run()是最直接的解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:04:03