C++ 协程2024年8月28日 | 阅读 7 分钟 本文将讨论 协程、其用途、实现、示例 和 输出。 什么是协程?C++ 中的 协程 是一种控制结构,其中 控制流 在不同例程之间传递而不停止。C++20 版本引入了 C++ 协程特性。协程是一种可以停止执行并在稍后恢复的方法。协程在开发的不同阶段以类似于一组有效的顺序代码的方式使用,但具有 非并发执行 的特性。由于 C++ 协程 具有无堆栈行为,因此该函数会将结果返回给 调用者。它继续指定的协程,该协程再次存储在已声明的隔离区域或堆栈中。 为什么使用 C++ 协程?您可以逐行读取记录,这 没问题,或者您可以读取一些关键且相关的信息来描述它。还可以将所有大型材料加载到 RAM 中。然而,对于频繁使用大型 文本文件 的应用程序,例如 MS Word 和 文本编辑器,则不建议这样做。 Donald Knuth 在计算机编程中引入了一种解决方案来解决这个问题。根据 Donald Knuth 的说法,我们可以完全抛弃堆栈概念。我们不需要允许调用者或被调用者经历任何过程。只需将它们视为合作的对等体。 C++ 中的协程实现为了实现 C++ 协程,必须满足以下两个条件:
如上所述,可以 静态变量 来解决问题。但是,您如何记住状态也回到了与前一个时刻相同的执行状态,即返回或循环之后的代码行?这里 GOTO 语句 是适用的。让我们看下面的代码。 让我们举一个例子来理解如何在 C++ 中使用协程。 编码输出 control at main :1 control at range control at main :2 control at range control at main :3 control at range control at main :4 control at range 说明 在此示例中,在 for 循环 内定义了许多返回语句。我们实际上每次都返回到不同的状态,如果程序配置为这样做,就会执行它。这种方法模仿了 Python 函数 称为 range 函数。C++ 协程概念也是该 Python 函数的基础。 C++ 中的协程如何工作?C++ 中的协程如下工作: 当 C++ 协程的主要执行完成时,它仍然可以在以后继续。主函数主要由 C++ 协程 调用,之后数据被保存在其他地方。协程 是函数,为了使它们工作,我们必须将它们的数据类型与它们关联起来。 C++ 协程 是出色的协程,因为它们总是与可变参数和返回语句相关联。但仍存在一些限制。主函数、常量表达式函数、构造函数 和 析构函数 无法创建完美的协程。 使用协程的执行范式有两个事物与 C++ 协程相关。第一个是 promise 对象,第二个是 coroutine 对象。promise 对象 是一个对象,它提供了一个同步点,并且可以包含一个值,该值可以被任何未来的 a=object(通常是另一个线程)获取。此外,在以高效方式提供协程状态时,会使用堆。状态对象具有以下特征: 参数选项。
协程的句柄当我们想在 协程帧 之外构建和执行代码时,我们会使用协程句柄。我们使用协程的 非使用处理程序 来恢复协程的执行,同时从帧中移除 C++ 协程。C++ 协程句柄在某种程度上类似于 c 指针,可以轻松地 复制,但我们没有析构函数来清除它占用的内存。因此,我们必须使用 coroutine_handle::destroy 方法来终止协程并防止内存泄漏。当协程被销毁时,指向被删除协程的协程句柄将被移除。现在它指向一个垃圾值,因此当调用协程句柄时,它将不再起作用。 标准返回对象C++ 协程返回一个具有嵌套 type::promise_type 作为其返回类型的对象。名为 r get_return_object 的方法,它返回一个 type r 的外部对象,应该包含在 r::promise_type 中。协程函数是 get_return_object 函数 的结果。 promise 对象协程状态中存在一个 promise 类型 的实例。我们可以添加一个名为 value 的字段来将值从协程传输到主函数。协程句柄被保留为 std::coroutine_handle<ReturnObject3::promise_type> 而不是转换为 std::coroutine_handle<>。 co_yield 运算符co_yield 运算符 将它从表达式中 yield 的值返回给调用者。它是可恢复生成器函数最受欢迎的组件之一,它会挂起正在运行的协程。 co_return 运算符 当使用 co_return 运算符 时,协程结束。可以通过三种方式进行信号通知:
使用协程时需要注意的事项我们永远不应忘记,以下是使用 C++ 协程的一些关键注意事项:
引用参数和协程实现 C++ 协程时,在协程挂起时不会保存完整的 调用堆栈。它只存储局部变量。基于堆栈 的完整协程是协程的一种 实现。另一方面,我们有 无堆栈协程,它保存和恢复 完整的调用堆栈。与任何其他 异步参数 类似,协程引用参数需要调用对象必须提供的引用参数。通过这样做,可以确保链接对象在对象持续时间内存在。 编码 输出 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 6 11 16 21 26 31 36 41 46 51 56 61 66 71 76 81 86 91 96 101 106 111 116 121 示例 2 在此示例中,从输出返回的值使用 C++ 协程进行了存储。 编码 输出 fut_1.get(): 2022 结论
|
在本教程中,我们将编写一个 C++ 程序来查找四个数字中的最大值。例如 a = 10, b = 50, c = 20, d = 25 最大数字是 b 50 a = 35, b = 50, c = 99, d = 2 最大数字……
阅读 4 分钟
数组是存储在内存中相邻的相关数据片段的集合。通过索引号检索每个数据片段的最基本数据结构。将数组的项按升序排列...
阅读 4 分钟
生成随机数在许多编程应用程序中都是一个常见的需求,C++ 提供了多种方法在给定范围内生成随机数。在本文中,我们将探讨在 C++ 中生成 1 到 10 之间随机数的不同方法。方法 1:使用 rand() 函数:一种...
阅读 4 分钟
?按位运算符主要用于低级编程。按位运算符允许我们设置、检查、清除或切换整数类型中的位。在嵌入式系统中,按位运算符对端口或寄存器的单个位执行按位操作。在本文中,我们将讨论...
阅读 4 分钟
CComPtr 和 CComQIPtr 是 Microsoft COM 库(Windows API 的一部分)提供的智能指针,用于管理 COM 对象的生命周期。它们用于简化创建、使用和释放 COM 对象的过程,并帮助避免诸如...
阅读 16 分钟
在本文中,您将了解 C++ 中的邻接列表及其不同的方法和实现。图表示:图是由连接这些节点的节点(顶点)和边组成的集合。图可以分为各种类型,包括有向图和无向图,加权和...
阅读 22 分钟
在组合数学和计算机科学中,稳定婚姻问题是一个著名的谜题。它涉及在两组元素(例如男性和女性)之间建立稳定匹配,其中每个人对构成另一组的个体都有不同的偏好。如果...
阅读 4 分钟
partition point() 获取分区点:返回一个迭代器,指向范围 [first, last] 中第一个谓词 pred(predicate) 为 false 的分区元素,表示该元素的 the partition point。如同使用相同的输入调用了 partition 一样,该范围的元素必须已经...
阅读 4 分钟
C++ 中的 casting operator dynamic_cast 用于将指针或引用从一种类型更改为另一种类型。运行时可以使用 dynamic_cast 运算符安全地向下转换多态类型。多态类型的类层次结构至少包含一个虚函数。语法:语法...
阅读 4 分钟
在本文中,我们将通过不同的方法找到矩阵的行列式。在找到行列式的值之前,我们必须了解矩阵的行列式。矩阵的行列式是仅为方阵(行数和列数相同的矩阵)指定的特定整数……
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India