C++学习协程笔记
原文
可以参考及这里,只看前半部分来更好理解协程,还有这一篇.
C++20协程背后有个状态机.
有协中,协待,协产就是协程.
调用协程
分配栈帧->造承诺对象->拷参数->造(协程+通信对象)->(立即/暂停)->返回值(通信对象返回)->消灭协程
可任意调用协程函数体.
用协程模拟简单函数.
sync<int> my_coroutine() {
co_return 42; //协程体
}
int main() {
auto coro = my_coroutine();
//返回整数的协程.
std::cout << "造协程" << std::endl;
auto result = coro.get();
std::cout << "结果:" << result << std::endl;
}
根据承诺类型的几个方法的返回类型来设置协程状态机的状态.协程生成了个状态机,用户通过状态来控制它.
查看状态机,里面有:帧+承诺类型+通信类型.通信类型要有有get_return_object,initial_suspend,final_suspend等函数的承诺类型.
承诺类型负责控制状态+保存返回值,要实现几个特殊函数.
取中对象得到有(协程句柄)的通信对象.
初始挂起表明创建协程后,是否挂起.
中值/中空只能有一个,有返回值为中值,否则为中空.类似的还有用于协产的产生值.
承诺类型:暂停协程,处理协程返回值,处理协程异常及返回通信对象.
空 中值(T),中值为协程的返回值.
承诺保存协程返回值后,协待 承诺.终挂起(),表示执行完协程.如果返回不挂起,则消灭协程等.否则,为总是挂起时,不消灭,由用户手动删除.
协程返回值,要传递给同步,要求该值可在同步/承诺中共享.因而用共针.
元<型名 T>构 同步{
共针<T>值;
同步(共针<T>p):值(p){
输出<<"构建同步"<<行尾;
}
同步(常 同步&s):值(s.值){
输出<<"复制"<<行尾;
}
~同步(){
输出<<"析构"<<行尾;
}
T 取(){
输出<<"取返回值"<<行尾;中*值;
}
构 承诺类型{
共针<T>针;
承诺类型():针(造共<T>()){
输出<<"建承诺"<<行尾;
}
~承诺类型(){
输出<<"承诺完蛋了"<<行尾;
}
动 取中对象(){
输出<<"通信对象/协程句柄"<<行尾;
中 针;
}
动 初始挂起(){
输出<<"启动协程"<<行尾;
中 从不挂起{};
}
空 返回值(T v){
输出<<"取协程结果"<<v<<行尾;
*针=v;
}
动 止挂起()无异{
输出<<"完成协程"<<行尾;
中 从不挂起{};
}
空 未处理异常(){
退出(1);
}
};
};
同步<整>我协程(){
输出<<"执行协程体"<<行尾;
协中 42;
}
整 主(){
动 协程=我协程();
输出<<"创建协程"<<行尾;
动 结果=协程.取();
输出<<"协程结果:"<<结果<<行尾;
}
目前,仅是暂停协程.无恢复及协待等.
浙公网安备 33010602011771号