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

Boost.Asio中使用io_context.poll_one处理挂起任务的疑问

Boost.Asio任务挂起与poll_one行为解析

核心问题解答

  • 这是预期行为。poll_one()的作用是执行一个当前就绪的任务,当协程调用io_task(yield)挂起时,当前协程会被暂停并退出io_context的执行队列,直到挂起的后台操作完成,协程才会被重新加入任务队列等待调度。
  • 挂起的任务不会自动继续执行:只有当挂起的操作(比如异步IO、定时器触发等)完成后,协程才会被重新插入任务队列,此时需要再次调用poll_one()(或poll()、run()等调度方法)才能继续执行后续代码。

示例代码分析

你的代码如下:

boost::asio::spawn(io_context_, [](const boost::asio::yield_context &yield) { 
   print("do stuff"); 
   io_task(yield);
   print("do more stuff");
});

io_context_.poll_one(); 

仅调用一次io_context_.poll_one()无法看到第二个print输出,执行流程是:

  1. 第一次调用poll_one(),协程启动,执行print("do stuff")输出内容;
  2. 进入io_task(yield)后协程挂起,退出io_context的执行队列,poll_one()完成当前任务后返回;
  3. 协程此时处于暂停状态,print("do more stuff")尚未执行。只有当io_task对应的后台操作完成,协程被重新加入任务队列后,再次调用poll_one()(或使用run()让io_context持续调度直到任务完成),才能执行协程剩余部分,输出第二个print内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:57:46