首页 > 编程语言 >C++ 20 协程

C++ 20 协程

时间:2024-02-16 19:44:18浏览次数:27  
标签:播放 20 await C++ c++ 协程 执行

目录

c++协程类型

Result Coroutine() {
  std::cout << 1 << std::endl;
  co_await std::suspend_always{};
  std::cout << 2 << std::endl;
  std::cout << 3 << std::endl;
  co_await std::suspend_always{};
  std::cout << 4 << std::endl;
};

这里的Result就是c++中协程所对应的类型
其中 co_await 是个关键字,它的出现,通常来说就会使得当前函数(协程)的执行被挂起。

协程的状态

音频 协程
音频文件 协程体
音频播放 协程执行
播放暂停 执行挂起
播放恢复 执行恢复
播放异常 执行异常
播放完成 协程返回

协程挂起时,我们需要记录函数执行的位置,C++ 协程会在开始执行时的第一步就使用 operator new
来开辟一块内存来存放这些信息,这块内存或者说这个对象又被称为协程的状态(coroutine state)

协程的状态不仅会被用于存放挂起时的位置(后称为挂起点),也会在协程开始执行时存入协程体的参数值。
例如:

Result Coroutine(int start_value) {
  std::cout << start_value << std::endl;
  co_await std::suspend_always{};
  std::cout << start_value + 1 << std::endl;
};

需要注意的是,如果参数是值类型,他们的值或被移动或被复制(取决于类型自身的复制构造和移动构造的定义)
到协程的状态当中;如果是引用、指针类型,那么存入协程的状态的值将会是引用或指针本身,而不是其指向的对象,
这时候需要开发者自行保证协程在挂起后续恢复执行时参数引用或者指针指向的对象仍然存活。

协程的挂起

协程的挂起是协程的灵魂。C++ 通过 co_await 表达式来处理协程的挂起,表达式的操作对象则为等待体(awaiter)。

await_ready

bool await_ready();

标签:播放,20,await,C++,c++,协程,执行
From: https://www.cnblogs.com/liviayu/p/18017406

相关文章

  • 8.【2024初三年前集训测试3】
    \(\Huge打了一场模拟赛,终于不垫底了。qwq\)2024初三年前集训测试3T1夕景昨日\(90pts\)不好想,一直做到最后了,然后发现过不了样例,发现读假题了\(\Largeqwq\Huge......
  • 2023年全年回顾
    本年度比较折腾,整体而言可以分为两个大的阶段,简单而言,转岗前和转岗后。个人收获据说程序员有几大浪漫,比如操作系统、编译器、浏览器、游戏引擎等。之前参与过游戏引擎,现在有机会参与存储业务交付,职业生涯的经历,距离完美又近了一步。个人总结本年度主打关键字,折腾、憋屈。有......
  • 2020年全年回顾
    19年10月被领导安排参与松湖会战,详细经历见2019年全年回顾,参与HMSCoreMLKit业务的交付工作。在19年12月份,在会战部门的领导安排下,作为主要责任人承接语音识别业务的交付工作。在20年7月,部门组织结构调整,一部分同事承接了新的业务,切换到了新部门。在20年10月,部门业务调整,HMSC......
  • 2021年全年回顾
    书接2020年全年回顾,在2020年11月,领导安排投入新的业务。由于业务调整,部门原有的业务都交接出去,因此迫切需要寻找新的方向。部门领导设计了几个方向,我参与的是其中一个,目标打造新的实时3D渲染产品,业界的竞品包括Unreal、Unity等。部门有同事一定投入,收集了资料供部门内同事学习,......
  • 2022年全年回顾
    书接2021年全年回顾,继续参与部门的新产品。个人收获学习incredibuild的使用方法,不过经过评估和实战,没有在产品中使用。使用了各种方式改善流水线的构建效率和体验,对提升开发团队的效率有一定帮助。按照公司的发布流程,处理开源软件的漏洞,学习并掌握了很多开源软件的构建方法,输......
  • P1204 [USACO1.2] 挤牛奶Milking Cows
    原题链接题解细节颇多看代码code#include<bits/stdc++.h>usingnamespacestd;structunit{ints,e;}milk[5005];boolcmp(unita,unitb){returna.s<b.s;}intmain(){intn;cin>>n;for(inti=1;i<=n;i++)cin>>milk[i].s......
  • 2024.2.16模拟赛总结
    前言:这次不太好,rank6,挂了108.5分,不挂就随便rank1了T1直接状压,设\(f[S][i][j][0/1]\)表示当前选的集合为S,最后两个分别为i,j的方案数和最优解,然后直接跑有亿点细节1:要开longlong,方案数可能很大(造一个完全图)2,要从合法的状态转移3,特判只有一个点的数据T2一道计算几何题首先......
  • PKUWC&WC2024游记
    Day-?A_zjzj踢球韧带被铲断了。本来好像是还没断的,但他被铲之后觉得没事又去打乒乓球了(Day-1请了个假回家睡大觉。早上模拟赛写了2hT4发现假了,最后20min火速改了个正确的出来,提前10minAK了。看不懂呼啸山庄/kkDay0睡大觉!早上九点到机房,发现机房里只有狗哥,我......
  • C++文件输入输出的简单实现(Debug)
    1.前言:        文件输入输出是个很有用的东西,有时比赛时要有:要求使用文件输入输出,还有时候……    遇到这种时间限制非常恶心的题目:手动测试会有误差……    文件输入输出是个很好的选择!2.写法:C    C语言的写法有点复杂,涉及文件指针,本文不......
  • 2023.2.16 LGJ Round
    A你有一个数组\(a\),初始为\(0\),你要使\(a_i\geh_i\),你可以把任意相邻两个\(a\),一个加一,另一个加二。问最少操作多少次。\(n,h\le1e6\)。B你需要求大小为\(n\)的环的个数,使得旋转后都不同。你可以选若干个点出来染上\(k\)个颜色中的一个,但是相邻两个点不能都能染颜......