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输出,执行流程是:
- 第一次调用
poll_one(),协程启动,执行print("do stuff")输出内容; - 进入
io_task(yield)后协程挂起,退出io_context的执行队列,poll_one()完成当前任务后返回; - 协程此时处于暂停状态,
print("do more stuff")尚未执行。只有当io_task对应的后台操作完成,协程被重新加入任务队列后,再次调用poll_one()(或使用run()让io_context持续调度直到任务完成),才能执行协程剩余部分,输出第二个print内容。
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

