无栈协程
本质是个可多次执行
的状态机
.一般使用协程
的标准流程
是,生成一个状态机
,返回状态机的(协柄)
句柄,通过控制该句柄
,不断反复执行(恢复)
.
执行
过程中,该状态机
作用是:不停产生数据
并写到某个地方
.所以c++20
协程提供了协产
和协中
,同时,每个协程
都应有个实现了产生值
或中值
函数的,承诺类型
的承诺
对象.
同时,每次把数据
写到承诺类型
后,协程
都会有一个暂停
机会,方便外部
取走数据.
于是协产 式
并不等价于承诺.产生值(式)
,而是等价于协待 承诺.产生值(式)
,协待
就是用来处理暂停
的.
类似,协中 式
也不等价于承诺.中值(式)
,而是等价于承诺.中值(式)
后,再协待 承诺.终挂起()
(中间有个析构过程
).
那么,协待
是怎么处理暂停
的呢?对协待 式
来说,式
一般是一个等待器
(也可通过一些规定好的函数转换成等待器
),等待器
实现了两个函数,直接协
和挂起协
.
直接协
定义是不是真需要暂停协程
,挂起协
定义暂停协程
后,继续去执行
什么,可以是回到调用者
,也可是启动
另一个协程,还可继续
执行当前协程.
通过挂起协
返回协程句柄
去启动
协程时,当前调用者
是不变的.
只有显式调用恢复
或创建协程
并直接执行,调用者
才会改变.
在此,大体已完成了协程
框架.但,还有很重要
的一点.
协程最重要
作用,就是不断
把数据写到承诺
对象.但是,如何把数据从承诺
对象中取出呢?
最简单的是,闲着.如,把数据
写到了承诺.值
中,直接通过承诺.值
取就够了.
不过,c++20
的协程还提供了,帮助简化从承诺
对象取数据
过程的额外(恢复协)
机制:
标准规定,当协待 等待器
时,等待器
还会实现恢复协
函数,该恢复协
的返回值
,就是整个协待 等待器
的返回值
.
一般,在定义
协程时,还会定义
从协程
到等待器
的转换,于是,如果A
协程想要从B
协程中取数据
,就可直接
通过协待 其他协程
实现,非常方便
.