6 协程
约 682 字大约 2 分钟
2025-06-22
协程就是一段可以挂起(suspend)和恢复(resume)的程序,一般而言,就是一个支持挂起和恢复的函数。
在C++中 函数定义包含了 co_await, co_yield , co_return 三个关键字的其一就是是协程。
能被多次调用的函数,每次只运行协程代码的一部分 每次调用之间本地变量和参数都会被保存,生命周期与调用者无关 本地变量和参数一般是在堆区保存,但在C++中也可以自己指定保存的区域
与线程的区别:线程会互相争抢,(同一个线程上运行的)协程只会在主动让出控制权时切换
关键对象
promise_type
对协程行为的配置 (比如是否在协程入口处挂起) 用于调用者与协程之间的数据传递 可以对协程对象增加一些自定义数据结构 (用于实现调度器)
coroutine_handle<promise_type>
外部操作协程的接口 (本质上是一个指针)
其中co_await是个关键字,它的出现,通常来说就会使得当前函数(协程)的执行被挂起。一般不是因为当前执行的线程被阻塞了,而是当前函数(协程)执行的位置被存起来,在将来某个时间点又读取出来继续执行的。 相当于其他语言的await
协程的挂起是协程的灵魂。C++通过co_await表达式来处理协程的挂起,表达式的操作对象则为等待体(awaiter)。
coroutine_interface
是coroutine的返回对象,对coroutine_handle的封装 在coroutine_handle的基础上再实现一些用户自定义的接口,比如获取返回值等 协程的返回值必须是coroutine_interface对象
awaitor
控制协程在挂起时的行为 决定是否挂起 决定把控制权交给谁 配置在控制器返回时做什么
关键字
co_await
co_await
调用一个awaiter对象(可以认为是一个接口),根据其内部定义决定其操作是挂起,还是继续,以及挂起,恢复时的行为。其呈现形式为
cw_ret = co_await awaiter;
cw_ret 记录调用的返回值,其是awaiter的await_resume 接口返回值。
co_yield
挂起协程。其出现形式是
co_yield cy_ret;
cy_ret会保存在promise承诺对象中(通过yield_value
函数)。在协程外部可以通过promise得到。
co_return
协程返回。其出现形式是
co_return cr_ret;
cr_ret会保存在promise承诺对象中(通过return_value
函数)。在协程外部可以通过promise得到。要注意,cr_ret并不是协程的返回值。这个是有区别的。
贡献者
版权所有
版权归属:PinkDopeyBug