首页 > 编程语言 >C++20协程接口说明

C++20协程接口说明

时间:2024-06-08 20:55:13浏览次数:16  
标签:调用 co 函数 协程 await C++ return 20

等待体的接口说明:

  bool await_ready()

表达了等待体对象是否准备就绪,返回false表示没有准备好,返回true表示准备好了,这个返回值决定了等待体的执行流程。

 bool await_suspend(Coro::coroutine_handle<Task::promise_type>)

当await_ready返回fasle时,进入此函数执行,如果await_ready返回true,则不执行此函数。

此函数的返回值可以是void,当返回值是void时,与返回值true一样。

当返回值是true时,表示协程在此挂起,挂起以后,执行权返回到调用方。

可以使用异步操作通过传递他的参数,使用resume函数恢复协程,也可以在调用方,使用协程函数的返回对象来恢复。

 void await_resume()

该函数表达了co_await的返回值,返回void表示co_await没有返回值。

当await_ready返回true时,直接进入此函数。

当await_suspend恢复时,直接执行此函数。

当await_susoend没有挂起时,直接执行此函数。

该函数运行完成,则co_await表达式执行完成。

 

promise_type接口说明:

new 通过调用new运算符,创建协程对象的内存。

 

peomise_type() 调用默认构造函数初始化对象。

 

T get_return_object()

       构造T的对象,如果对象不需要控制句柄,则可以直接返回T{ },否则 :return Coro::coroutine_handle<promise_type>::from_promise(*this);

T是包含promise_type类型的协程类。

 

auto initial_suspend()

初始化协程的最后一步,该函数执行完,表示协程已经准备好,下一步可以执行协程体了。

返回值是一个等待体,表达了,是否需要挂起。

如果挂起,则执行权回到调用方,等待调用方恢复,没有挂起,则开始执行协程函数。

包含此步骤之前的步骤,如果抛出异常,那么异常都将会传递给调用方。

 

auto await_transfoem(T expr)

该函数表示co_awiat可以接受一个expr值,并将其处理,返回一个可等待的对象(必须)。

不写此函数,编译器默认生成一个通用的版本。

编写此函数,编译器则不会生成通用版本,需要手动编写通用版本。

       await_transform无法专用化,也就是特化,很特殊,编译器不允许特化。可以重载,但是重载,要尽量先编写通用的泛型版本,否则co_await表达式直接使用重载的版本。

       通用的版本如下:

    template<typename T> auto await_transform(T&& v) { return std::forward<T&&>(v); }

       对于重载的示例可以是:

    Coro::suspend_always await_transform(int&& v) { return {}; }

       重载版本、所有版本,必须都在一个类中,父类的通用版本,在子类里不生效,依然会导致重载co_await决策失败,

      

       auto yield_value(T expr)

       对于co_yield表达式对应的生成器函数,expr表示co_yield 的expr,返回值是一个等待体,可以挂起,也可以不挂起。

 

       void return_void()

       协程函数没有co_return,或者co_return 没有值时,使用此函数。

 

       void return_value(T expr)

       当co_return 有值时,将值传递给expr,执行此函数。

 

       auto final_susend() noexcept

       表示协程即将结束了,此函数返回一个等待体,表示是否挂起,挂起是为了要获取协程内部的数据,挂起不能使用resume恢复,因为是最终挂起点,只能destory。

       注意因为无法恢复,所以等待体的await_resume可能不会执行。

 

       void unhandled_exception()

       如果在执行协程体过程中,出现异常,协程捕获异常,并在catch块中调用此函数。

       如果协程没有捕获异常结束,那么捕捉异常,调用此函数,调用final-suspend,此时恢复协程是未定义的。

       如果异常是co_return触发的,那么调用承诺对象的析构函数,调用各个形参副本的析构函数,调用delete释放协程状态所有内存。

 

       delete 运算符 释放协程状态内存。

 

其他:

       co_await的重载,只能是类、结构体、联合体,不能是枚举、基本类型。(vs2022可以重载枚举类型)

 

标签:调用,co,函数,协程,await,C++,return,20
From: https://www.cnblogs.com/Super-biscuits/p/18238936

相关文章

  • 柔性数组+总结C/C++中程序内存区域划分
    柔性数组一.柔性数组1.柔性数组的定义2.柔性数组的特点3.柔性数组的使用4.柔性数组的优势二.总结C/C++中程序内存区域划分前言:也许你从来没有听说过柔性数组这个概念,但是它确实是存在的。一.柔性数组1.柔性数组的定义C99中,结构体中的最后一个元素允许是未知大小的......
  • 【一百一十】【算法分析与设计】[SDOI2009] HH的项链,树状数组应用,查询区间的种类数,
    P1972[SDOI2009]HH的项链[SDOI2009]HH的项链题目描述HH有一串由各种漂亮的贝壳组成的项链。HH相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。HH不断地收集新的贝壳,因此,他的项链变得越来越长。有一天,他突然提出了一个问......
  • 2022.9.22DAY674
    课程学习:《模式识别》,讲了“最小均方误差算法”,从误差算法怎么来以及如何使用。 android实验课,讲了一些基本控件的使用,这些都是基础的东西,值得我去注意的是老师讲到如何通过官网文档去查看控件的属性,方法。以及通过文件去找到相关的开源代码,对于一个开发者来说,这才是值得去......
  • C++特点,对象的概念,初始化和赋值
    C++是面向对象的变成语言,C++的特点是封装,继承,多态,同时也是面向对象语言的特点。在C++中的对象指一块能存储数据并具有某种类型的内存空间,例如当我们写一句inta时,int是C++的基本类型,a就是一个对象,如果将inta写成的inta=10;那么这句语句的含义是创建了一个int类型的对象,并给......
  • CCF-GESP 等级考试 2023年9月认证C++四级真题解析
    一、单选题(每题2分,共30分)第1题⼈们所使⽤的⼿机上安装的App通常指的是()。A.⼀款操作系统B.⼀款应⽤软件C.⼀种通话设备D.以上都不对正确答案:B.⼀款应⽤软件解析:App是"Application"的缩写,中文意思是"应用",特指安装在智能手机上的第三方应用软件。这些软件通常......
  • kalilinux的200个命令
      pwd-显示当前工作目录的路径ls-列出目录内容cd-更改目录echo-显示文本cat-连接文件并显示touch-创建文件rm-删除文件或目录mv-移动或重命名文件或目录cp-复制文件或目录chmod-更改文件或目录的权限chown-更改文件或目录的所有者grep-......
  • 南昌航空大学软件学院23201823第二次blog
    一、前言:这是第二次的blog,接下来关于这最近三次的PTA大作业,只有第一次是上次答题判题程序的延续,接下来则是一个全新的关于电路的设计,最新的电路设计相较于之前的答题判题程序来说的话,难度确实有所下降。前两次中都含有三道题,而最后一次的PTA则是删去了其余两道题,让我们专心钻研新......
  • 代码随想录算法训练营第四天 Leetcode 24 两两交换链表节点 Leetcode19 删除链表倒数
    链表问题首先要记住设置虚拟头节点Leetcode24两两交换链表节点题目链接思路:就是简单模拟两两交换 要注意链表节点的处理一定要获取到合适的位置比如:这一题中两个交换节点的前一个节点注意链表保存临时节点/***Definitionforsingly-linkedlist.*publicclas......
  • C++--移动构造函数/移动赋值运算符
    C++--移动构造函数/移动赋值运算符什么是移动语义?在C++11中,移动语义是一个重要的新特性,它可以使程序在内存管理方面更加高效,同时也提高了程序的性能它允许将一个对象的所有权从一个对象转移到另一个对象,而不需要进行数据的拷贝。通俗理解我有一份材料,A同学找我借,那我把材料......
  • C++ -- noexcept关键字
    C++--noexcept关键字noexcept关键字作用:告诉编译器,函数中不会发生异常,有利于编译器对程序做出更多的优化,比如避免生成处理异常的额外代码,减少程序的大小例子声明了noexcept和没有声明的同一段代码:safeDivide当除数为0时,会直接调用std::terminate()来中止程序而不是throw......