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;
}

整 主(){
  动 协程=我协程();
  输出<<"创建协程"<<行尾;
  动 结果=协程.取();
  输出<<"协程结果:"<<结果<<行尾;
}

目前,仅是暂停协程.无恢复及协待等.

posted @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示