C++协程场景:控制权返回至已挂起的coroutine_a时会怎样?
协程控制权流转问题解答
正确的情况是:控制权回到coroutine_a后,它会从co_await awaiter_a;的挂起位置继续往下执行,既不会直接返回调用者,也不会保持挂起状态。
完整流程拆解
- 当coroutine_a执行
co_await awaiter_a;时,awaiter_a::await_suspend返回coroutine_b的协程句柄,此时coroutine_a被挂起,系统立即恢复coroutine_b的运行。 - coroutine_b运行到
co_await awaiter_b;时,由于awaiter_b::await_suspend返回void,coroutine_b会被挂起,控制权会交还给恢复它的那个协程(也就是coroutine_a)。 - 此时coroutine_a会从之前
co_await awaiter_a的下一行代码开始继续执行,直到它自身遇到新的挂起点(比如另一个co_await)或者执行完毕,才会返回给它自己的调用者。
对两种假设的纠正
- 假设1错误:coroutine_a不会直接返回调用者,它只是在
co_await awaiter_a处临时挂起,现在被coroutine_b的挂起触发了恢复,需要继续完成后续的逻辑。 - 假设2错误:coroutine_a此时已经被恢复运行,不会保持挂起状态,除非它后续主动执行了新的挂起操作。
内容的提问来源于stack exchange,提问作者Machearn
相关产品推荐
相关产品推荐

