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;
}
整 主(){
动 协程=我协程();
输出<<"创建协程"<<行尾;
动 结果=协程.取();
输出<<"协程结果:"<<结果<<行尾;
}
目前,仅是暂停
协程.无恢复
及协待等.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现