热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

c++协待

co_awaitexprco_await(协待)是C20新关键字.上面表示等待懒求值任务.不希望该任务阻塞调用者,用协待挂起任务.调用者继续.任务完成后,协待返回协程的结果.有两个

co_await expr

co_await(协待)C++20新关键字.上面表示等待懒求值任务.不希望该任务阻塞调用者,用协待挂起任务.调用者继续.任务完成后,协待返回协程的结果.有两个作用:挂起协程及取协程返回值.
协待等待任务时,不阻塞调用者,就是协程异步同步的关键.
协待类似调用函数.对象有()时是可调用的.对象支持协待()时,就是可等待的.协待后的可等待式.

总是挂起
协待 从不挂起;
空 测试(){协待 总是挂起{};
}//错误,缺少承诺类型.

协待必须在协程中,协程必须要有承诺类型.通过它返回内外通信对象.

构 任务{//任务构 承诺类型{任务 取中对象(){{协程句柄<任务::承诺类型>::从承诺(*)};}从不挂起 初始挂起(){{};}从不挂起 止挂起()无异{{};}空 中空(){}空 未处理异常(){}};协程句柄<任务::承诺类型>句柄_;
};任务 测试(){协待 总是挂起{};//.1
}

.1转换为前面见过的模板框架代码:

{//&&&#61;总是挂起{};
//先取表达式值.&&w&#61;取可等待(承诺,静转<推导()>());
//然后取&#96;可等待&#96;.&&等待器&#61;取等待器(静转<推导(w)>(w));(!等待器.准备好协()){用 句柄型&#61;实验::协程句柄<P>;用 等待挂起果型&#61;推导(等待器.挂起协(句柄型::从承诺(p)));<挂起协程>如 常式(是空值<等待挂起果型>){等待器.挂起协(句柄型::从承诺(p));<返回到调用者或恢复者>}{静断(是相同值<等待挂起果型,>,"挂起协()必须中&#39;空&#39;或&#39;极&#39;.");(等待器.挂起协(句柄型::从承诺(p))){<返回到调用者或恢复者>}}<恢复点>}中 等待器.恢复协();
}
//取可等待的代码
<类 P,类 T>
推导()取可等待(P&承诺,T&&)
{如 常式(有任何等待转换成员值<P>)中 承诺.等待转换(静转<T&&>());异中 静转<T&&>();
}

如果协程的承诺中定义了await_transform,那么就调用来得到可等待,否则就按可等待返回自己,这里,未在task里面定义await_transform,因此总是挂起将为可等待,实现代码:

构 总是挂起{常式 极 准备好协()常 无异 中 假;常式 空 挂起协(协程句柄<>)常 无异{}常式 空 恢复协()常 无异{}
};

取了总是挂起后,再根据它来取等待器,代码:

<类 W>
推导()取等待器(W&&w)
{如 常式(有成员操作符协待值<W>)中 静转<W&&>(w).符号 协待();//有自身的&#96;协待异 如 常式(无成员操作符协待值<W&&>)中 符号 协待(静转<W&&>(w));//全局协待异中 静转<W&&>(w);//自身转为&#96;等待器&#96;.
}

等待器可等待的返回对象.1,用专门带约束对象来实现挂起协程取协程返回值.2,灵活性和扩展性.可等待作为间接层,保存协待环境,可做更多事情.
等待器必须实现准备好等待(.1)/挂起等待(.2)/恢复等待(.3).
.1为假,就挂起协程,调用.2.如果.2返回真/空,就返回到调用者.返回,就执行协待下面语句..1为真,说明执行完协程,调用.3返回协程结果.

展示协待

构 任务{构 承诺类型{任务 取中对象(){{协程句柄<任务::承诺类型>::从承诺(*)};}从不挂起 初始挂起(){{};}从不挂起 止挂起()无异{{};}空 中空(){ 输出<<"取协程结果\n"; }//5空 未处理异常(){}};协程句柄<任务::承诺类型>句柄_;//外部控制.
};任务 测试(){输出<<"创建协程\n";//1协待 总是挂起{};//在这里挂起了.输出<<"这是恢复点\n";//4
}
整 主(){动 t&#61;测试();输出<<"现在返回调用者\n";//2输出<<"调用者恢复挂起协程\n";t.句柄_();//3输出<<"消灭协程\n";//6
}

可定义等待器,控制它的.1和.2来控制协程.
一般在.2中发起异步操作,此时协程是挂起的.返回调用者不阻塞.完成异步操作后,通过.3返回协程返回值,并恢复协程.结束协待,调用者拿到结果.


推荐阅读
  • 在安装 SQL Server 时,选择混合验证模式可以提供更高的灵活性和管理便利性。如果您已经安装了 SQL Server 并使用单一的 Windows 身份验证模式,可以通过以下步骤将其更改为混合验证模式。 ... [详细]
  • 设计模式在软件开发中被广泛应用,但如果不当使用,可能会导致系统复杂性增加。例如,过度添加类可能导致类图难以理解,代码跟踪变得复杂。本文探讨如何在使用设计模式时保持系统的简洁和高效。 ... [详细]
  • CentOS 系统管理基础
    本文介绍了如何在 CentOS 中查询系统版本、内核版本、位数以及磁盘分区的相关知识。通过这些命令,用户可以快速了解系统的配置和磁盘结构。 ... [详细]
  • MongoDB的核心特性与架构解析
    本文深入探讨了MongoDB的核心特性,包括其强大的查询语言、灵活的文档模型以及高效的索引机制。此外,还详细介绍了MongoDB的体系结构,解释了其文档、集合和数据库的层次关系,并对比了MongoDB与传统关系型数据库(如MySQL)的逻辑结构。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • ArcXML:互联网空间数据交换的专用语言
    ArcXML是一种专为ArcIMS平台设计的数据交换协议,基于XML标准,用于在不同组件之间传输和描述地理空间数据。本文将详细介绍ArcXML的背景、用途及其与XML的关系。 ... [详细]
  • 精选多款高效实用软件及工具推荐
    本文介绍并推荐多款高效实用的软件和工具,涵盖系统优化、网络加速、多媒体处理等多个领域,并提供安全可靠的下载途径。 ... [详细]
  • 创邻科技成功举办Graph+X生态合作伙伴大会,30余家行业领军企业共聚杭州
    9月22日,创邻科技在杭州举办“Graph+X”生态合作伙伴大会,汇聚了超过30家行业头部企业的50多位企业家和技术领袖,共同探讨图技术的前沿应用与发展前景。 ... [详细]
  • Vue 开发与调试工具指南
    本文介绍了如何使用 Vue 调试工具,包括克隆仓库、安装依赖包、构建项目以及在 Chrome 浏览器中加载扩展的详细步骤。 ... [详细]
  • MySQL DATETIME 类型长度及使用指南
    本文详细介绍了 MySQL 中 DATETIME 类型的长度要求及其格式规范,并补充了其他常见数据类型的说明,帮助开发者更好地理解和使用这些类型。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • 本文详细介绍了C语言中的基本数据类型,包括整型、浮点型、字符型及其各自的子类型,并探讨了这些类型在不同编译环境下的表现。 ... [详细]
  • 本文详细介绍了虚拟专用网(Virtual Private Network, VPN)的概念及其通过公共网络(如互联网)构建临时且安全连接的技术特点。文章探讨了不同类型的隧道协议,包括第二层和第三层隧道协议,并提供了针对IPSec、GRE以及MPLS VPN的具体配置指导。 ... [详细]
  • Java多重继承的替代方案及设计考量
    本文探讨了Java为何不支持多重继承,并深入分析了其背后的原理和替代方案。通过理解Java的设计哲学,开发者可以更好地利用接口和其他特性来实现复杂的类结构。 ... [详细]
  • 在寻找轻量级Ruby Web框架的过程中,您可能会遇到Sinatra和Ramaze。两者都以简洁、轻便著称,但它们之间存在一些关键区别。本文将探讨这些差异,并提供详细的分析,帮助您做出最佳选择。 ... [详细]
author-avatar
UP向日葵氵于磊Z
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有