Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
c++中协程是什么_C++20协程原理与基本用法入门_创想鸟

c++中协程是什么_C++20协程原理与基本用法入门

C++20协程是可暂停恢复的函数,通过co_await、co_yield、co_return实现异步编程;其核心由promise对象、coroutine_handle和awaitable对象构成,需手动管理生命周期,常用于生成器等场景。

c++中协程是什么_c++20协程原理与基本用法入门

C++20 引入了协程(Coroutines),它是一种可以暂停和恢复执行的函数,允许你在函数执行到某个点时挂起,之后从中断的地方继续运行。这不同于普通函数——一旦调用并返回,上下文就丢失了。协程保留了执行状态,适合用于异步编程、生成器、惰性求值等场景。

协程的基本特征

协程不是线程,也不涉及操作系统调度。它是用户态的控制流切换机制,由编译器支持实现。C++20 的协程是无栈协程(stackless),意味着它们不能在任意位置挂起,只能在 co_await、co_yield 或 co_return 处暂停。

一个函数只要包含以下关键字之一,就会被编译器识别为协程:

co_await:等待一个异步操作完成,期间可挂起co_yield:产出一个值后挂起,常用于生成器co_return:结束协程并返回结果

协程的核心组件

C++20 协程依赖三个关键部分:promise 对象、coroutine handle 和 awaitable 对象。

立即学习“C++免费学习笔记(深入)”;

1. Promise 类型

每个协程都有一个关联的 promise 对象,它控制协程的行为,比如如何开始、如何返回值、如何处理异常。你需要在返回类型中定义 promise_type。

示例:简单的 generator

templatestruct Generator {    struct promise_type {        T value;        auto get_return_object() { return Generator{this}; }        auto initial_suspend() { return std::suspend_always{}; }        auto final_suspend() noexcept { return std::suspend_always{}; }        void return_void() {}        auto yield_value(T v) {            value = v;            return std::suspend_always{};        }        void unhandled_exception() { std::terminate(); }    };
using handle_type = std::coroutine_handle;explicit Generator(promise_type* p)    : coro_(handle_type::from_promise(*p)) {}~Generator() { if (coro_) coro_.destroy(); }bool next() {    if (!coro_ || coro_.done()) return false;    coro_.resume();    return !coro_.done();}T value() const { return coro_.promise().value; }

private:handletype coro;};

2. Awaitable 与 co_await

任何对象只要提供了 await_ready、await_suspend、await_resume 方法,就可以被 co_await 使用。这是实现异步等待的基础。

例如:

struct Awaiter {    bool await_ready() { return false; } // 是否立即继续    void await_suspend(std::coroutine_handle h) {         // 可以把 h 存起来,稍后手动 resume    }    int await_resume() { return 42; }};

Generator count_three() {co_yield 1;co_yield 2;co_yield 3;}

协程的实际使用示例

下面是一个完整的生成器例子,展示如何使用协程逐步返回数值:

#include #include 

// 上面的 Generator 定义放在这里

void test_generator() {auto gen = count_three();while (gen.next()) {std::cout << gen.value() << 'n';}}

输出结果为:

123

每次调用 next(),协程从上次挂起点恢复,执行到下一个 co_yield。

协程的生命周期与资源管理

协程启动后,其帧(frame)通常分配在堆上,由运行时管理。你必须确保协程句柄(coroutine_handle)正确销毁,否则会内存泄漏。

initial_suspend 决定协程是否一开始就挂起。若返回 suspend_always,协程创建后不会自动运行,需要手动 resume;若返回 suspend_never,则立即执行。

当协程遇到 co_return 或异常未被捕获时,进入最终挂起点(final_suspend),此时你可以决定是否再次挂起以便清理资源。

基本上就这些。C++20 协程虽然强大,但接口较为底层,需要自己封装常用模式。理解 promise、handle 和 awaitable 的协作方式,是掌握协程的关键。实际项目中推荐结合现有库如 cppcoro 来简化使用。

以上就是c++++中协程是什么_C++20协程原理与基本用法入门的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1476952.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
c++怎么获取当前系统时间_c++获取系统时间方法
上一篇 2025年12月19日 01:36:44
c++如何生成一个随机数_c++ 随机数生成方法
下一篇 2025年12月19日 01:36:59

相关推荐

  • 时隔 6 年,诺基亚 800 Tough 三防神机迎来改款

    时隔 6 年,诺基亚 800 Tough 三防神机迎来改款时隔 6 年,诺基亚 800 Tough 三防神机迎来改款时隔 6 年,诺基亚 800 Tough 三防神机迎来改款时隔 6 年,诺基亚 800 Tough 三防神机迎来改款

    近日有消息源发文爆料,称 hmd global 计划更新诺基亚 800 tough 三防功能机,在保留原版设计前提下,端口升级到 usb-c 接口,系统升级到 kaios 3.1 版本。 据了解,HMD Global 在 2019 年发布经典三防功能手机 —— 诺基亚 800 Tough,而时隔 6…

    2026年9月26日 • 用户投稿
    000
  • 饿了么周末优惠券领取入口_饿了么周末外卖折扣领取方法

    饿了么周末优惠券领取入口_饿了么周末外卖折扣领取方法饿了么周末优惠券领取入口_饿了么周末外卖折扣领取方法饿了么周末优惠券领取入口_饿了么周末外卖折扣领取方法饿了么周末优惠券领取入口_饿了么周末外卖折扣领取方法

    答案:可通过周末红包活动、搜索“本地宝”口令、关注第三方公众号及开通饿了么会员四种方式获取周末优惠券。首先在饿了么App内参与【周末红包节】领取最高66元组合红包;其次通过搜索【本地宝】获取区域专属6-10元限时券;再者关注【外卖优惠哥】等公众号获取自动推送的领券链接与返利;最后开通饿了么会员享受每…

    2026年9月26日 • 用户投稿
    000
  • Java泛型陷阱:Pair中List类型丢失问题及解决方案

    Java泛型陷阱:Pair中List类型丢失问题及解决方案Java泛型陷阱:Pair中List类型丢失问题及解决方案Java泛型陷阱:Pair中List类型丢失问题及解决方案Java泛型陷阱:Pair中List类型丢失问题及解决方案

    本文探讨了在Java中使用包含List的Pair时,若迭代循环中未正确使用泛型,可能导致List类型信息丢失的问题。核心在于,使用裸类型(Raw Type)的Pair会导致其内部泛型参数被擦除为Object,从而无法访问List特有的方法。解决方案是在循环声明中明确指定泛型类型,以确保编译时类型安全…

    2026年9月26日 • 用户投稿
    200
  • Linux命令如何复制

    Linux命令如何复制Linux命令如何复制Linux命令如何复制Linux命令如何复制

    Linux 中的复制操作:cp 命令:用于复制文件和目录,可自定义复制行为(例如,递归、保留属性)。ln 命令:创建文件硬链接或符号链接,指向实际文件或文件路径。rsync 命令:用于高级复制,提供增量复制、带宽限制和错误处理等功能。 Linux命令:复制 复制是Linux操作系统中常用的操作之一,…

    2026年9月26日 • 用户投稿
    000
  • WebSailor— 阿里通义实验室开源的网络智能体

    WebSailor— 阿里通义实验室开源的网络智能体WebSailor— 阿里通义实验室开源的网络智能体WebSailor— 阿里通义实验室开源的网络智能体WebSailor— 阿里通义实验室开源的网络智能体

    WebSailor是什么 websailor 是由阿里通义实验室推出的开源网络智能体,专注于处理复杂的检索与推理任务。借助创新的数据合成方法(如 sailorfog-qa)以及训练技术(包括拒绝采样微调和 dupo 算法),该模型在高难度任务中表现出色,在 browsecomp 等评测中超越多个主流…

    2026年9月26日 • 用户投稿
    200
  • 手机远程监控摄像头推荐——选购指南(了解市场上什么牌子的手机远程监控摄像头性能好)

    手机远程监控摄像头推荐——选购指南(了解市场上什么牌子的手机远程监控摄像头性能好)手机远程监控摄像头推荐——选购指南(了解市场上什么牌子的手机远程监控摄像头性能好)手机远程监控摄像头推荐——选购指南(了解市场上什么牌子的手机远程监控摄像头性能好)手机远程监控摄像头推荐——选购指南(了解市场上什么牌子的手机远程监控摄像头性能好)

    问题:如何选择可靠的远程监控摄像头来保护您的家庭安全?简要说明:选择一款合适的远程监控摄像头至关重要,可以为您提供实时监控和安全保障。引导语:继续阅读本文,php小编新一将为您推荐多个值得信赖的品牌,并详细介绍其功能和优点,帮助您轻松找到理想的远程监控摄像头,守护您的家庭安全。 市场上的手机远程监控…

    2026年9月26日 • 用户投稿
    000
  • 使用泛型解决Pair中List无法访问的问题

    使用泛型解决Pair中List无法访问的问题使用泛型解决Pair中List无法访问的问题使用泛型解决Pair中List无法访问的问题使用泛型解决Pair中List无法访问的问题

    本文介绍了在使用 javatuples 库中的 Pair 类时,当 Pair 的第二个元素是 List 类型,并且在循环中访问该 List 时,可能遇到的无法访问 List 的 size() 方法或元素的问题。通过在循环中使用泛型来明确 Pair 中 List 的类型,可以有效解决此问题,确保 Li…

    2026年9月26日 • 用户投稿
    000
  • 2025年抖音最火的简介句子有哪些?如何写吸引粉丝的简介?2025年抖音最火的简介句子及吸粉技巧全解析

    2025年抖音最火的简介句子有哪些?如何写吸引粉丝的简介?2025年抖音最火的简介句子及吸粉技巧全解析2025年抖音最火的简介句子有哪些?如何写吸引粉丝的简介?2025年抖音最火的简介句子及吸粉技巧全解析2025年抖音最火的简介句子有哪些?如何写吸引粉丝的简介?2025年抖音最火的简介句子及吸粉技巧全解析2025年抖音最火的简介句子有哪些?如何写吸引粉丝的简介?2025年抖音最火的简介句子及吸粉技巧全解析

    在每天诞生200万条新视频的抖音生态中,用户滑走一个视频的平均反应时间已压缩至0.8秒。在此背景下,个人简介成为创作者抢占用户注意力的黄金30字阵地。 一、2025年抖音简介的流量密钥 科技感宣言:“AI生成的快乐,人类验证的精彩”“元宇宙入口在此,双击开启未来” 情绪价值放大器:“你的电子多巴胺补…

    2026年9月26日 • 用户投稿
    100
  • Java中Pair嵌套List时泛型丢失问题解析与最佳实践

    Java中Pair嵌套List时泛型丢失问题解析与最佳实践Java中Pair嵌套List时泛型丢失问题解析与最佳实践Java中Pair嵌套List时泛型丢失问题解析与最佳实践Java中Pair嵌套List时泛型丢失问题解析与最佳实践

    本文深入探讨了在Java中使用org.javatuples.Pair嵌套List时,因不当使用泛型(即使用原始类型)导致List功能异常的问题。通过分析原始类型Pair在增强型for循环中的行为,揭示了类型擦除如何影响内部List的访问。文章提供了正确的泛型使用方式,确保在迭代过程中List的类型信…

    2026年9月26日 • 用户投稿
    100
  • laravel如何创建自定义的Artisan命令_Laravel自定义Artisan命令教程

    答案:在 Laravel 中创建自定义 Artisan 命令可自动化常用任务,使用 make:command 生成命令类,配置 signature 和 description 属性定义调用方式与描述,于 handle() 方法编写逻辑,通过 argument() 和 option() 获取参数与选项…

    2026年9月26日
    000
  • 如何查看本机IP地址—一步指南介绍本地网络IP查询技巧

    本地IP是设备在家庭网络中的标识。通过系统设置可直观查看:Windows在“网络和Internet设置”中查找IPv4地址;macOS在“系统偏好设置-网络”查看;手机在Wi-Fi详情中获取。命令行方式更高效:Windows用ipconfig,macOS/Linux用ifconfig | grep …

    2026年9月26日
    000
  • sublime怎么给vue文件设置高亮_sublime Vue文件语法高亮设置

    sublime怎么给vue文件设置高亮_sublime Vue文件语法高亮设置sublime怎么给vue文件设置高亮_sublime Vue文件语法高亮设置sublime怎么给vue文件设置高亮_sublime Vue文件语法高亮设置sublime怎么给vue文件设置高亮_sublime Vue文件语法高亮设置

    Sublime Text 默认不支持 Vue 文件的语法高亮,但可以通过安装插件来实现。Vue 文件是混合语法(HTML、JavaScript、CSS),需要专门的语法定义才能正确高亮。以下是设置步骤: 1. 安装 Package Control(如未安装) 如果还没安装 Package Contr…

    2026年9月26日 • 用户投稿
    000
  • Java中InterruptedException与线程中断配合使用

    InterruptedException是Java中用于线程中断的检查异常,当线程在阻塞操作中被中断时抛出;调用interrupt()方法仅设置中断状态,线程需自行响应;常见可中断方法包括sleep、wait、join等;捕获该异常后应恢复中断状态或进行清理并退出;错误地忽略异常会导致中断信号丢失,…

    2026年9月26日
    000
  • Gemini需要GPU支持吗 Gemini对硬件的依赖与运行建议

    Gemini需要GPU支持吗 Gemini对硬件的依赖与运行建议Gemini需要GPU支持吗 Gemini对硬件的依赖与运行建议Gemini需要GPU支持吗 Gemini对硬件的依赖与运行建议Gemini需要GPU支持吗 Gemini对硬件的依赖与运行建议

    很多人在使用或了解大型语言模型Gemini时,都会好奇它是否必须依赖高性能的图形处理器(GPU)才能运行。本文将围绕Gemini对硬件的需求这一核心问题进行探讨,详细说明GPU在其中的作用、模型的其他硬件依赖性以及为获得更好体验而提供的运行建议。通过了解这些信息,您可以更好地评估和准备适合运行或利用…

    2026年9月26日 • 用户投稿
    100
  • 苹果 AI 功能滞后 外媒建议借鉴对手三大功能迎头赶上

    苹果 AI 功能滞后 外媒建议借鉴对手三大功能迎头赶上苹果 AI 功能滞后 外媒建议借鉴对手三大功能迎头赶上苹果 AI 功能滞后 外媒建议借鉴对手三大功能迎头赶上苹果 AI 功能滞后 外媒建议借鉴对手三大功能迎头赶上

    苹果在人工智能(ai)领域的发展似乎并不顺利。自去年全球开发者大会(wwdc)以来,苹果承诺的众多ai功能至今尚未实现,使得其在这一领域的竞争力比去年6月时有所下降。有外媒建议,苹果可以借鉴竞争对手的三大ai功能来迎头赶上。 借鉴谷歌的Notebook LM 谷歌的Notebook LM具备自定义指…

    2026年9月26日 • 用户投稿
    000
  • 如何使用Gemini多模态功能 Gemini图文视频输入操作方法详解

    如何使用Gemini多模态功能 Gemini图文视频输入操作方法详解如何使用Gemini多模态功能 Gemini图文视频输入操作方法详解如何使用Gemini多模态功能 Gemini图文视频输入操作方法详解如何使用Gemini多模态功能 Gemini图文视频输入操作方法详解

    本文将详细介绍如何利用Gemini的多模态功能,特别是如何进行图文和视频的联合输入操作。通过阅读本文,您将了解到Gemini如何理解和处理不同类型的信息组合,并掌握将文本、图片和视频融入对话的具体步骤,从而更有效地使用这项强大的AI能力。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无…

    2026年9月26日 • 用户投稿
    100
  • 夸克AI写作文靠谱吗_夸克AI写作助手效果与能力评测

    夸克AI写作文靠谱吗_夸克AI写作助手效果与能力评测夸克AI写作文靠谱吗_夸克AI写作助手效果与能力评测夸克AI写作文靠谱吗_夸克AI写作助手效果与能力评测夸克AI写作文靠谱吗_夸克AI写作助手效果与能力评测

    夸克AI写作助手在高考作文辅导中表现优异,能快速构建逻辑清晰的议论文结构,围绕“第二次呼吸”等题目提炼成长主题,分论点衔接自然;引用2024年敦煌数字化修复、马拉松真实数据等新颖素材,增强时代感与说服力;语言表达生动,善用比喻与哲理金句,避免空洞口号;实际应用中获教师认可,助力学生提升写作效率与思维…

    2026年9月26日 • 用户投稿
    100
  • WPS格式文件中的宏如何安全处理_WPS宏安全管理与处理步骤

    WPS格式文件中的宏如何安全处理_WPS宏安全管理与处理步骤WPS格式文件中的宏如何安全处理_WPS宏安全管理与处理步骤WPS格式文件中的宏如何安全处理_WPS宏安全管理与处理步骤WPS格式文件中的宏如何安全处理_WPS宏安全管理与处理步骤

    首先禁用所有宏并启用通知,再检查宏来源与数字签名,对可疑文件使用沙箱环境测试,必要时清除文档宏代码,最后通过受信任位置管理合法宏运行。 如果您在打开WPS格式文件时遇到宏相关提示或安全警告,可能是文档中包含可执行的宏代码。不正确的处理可能导致恶意代码运行,威胁系统安全。以下是针对WPS文件中宏的安全…

    2026年9月26日 • 用户投稿
    100
  • Node.js spawn 命令参数解析与 shell: true 的应用

    Node.js spawn 命令参数解析与 shell: true 的应用Node.js spawn 命令参数解析与 shell: true 的应用Node.js spawn 命令参数解析与 shell: true 的应用Node.js spawn 命令参数解析与 shell: true 的应用

    本文探讨Node.js child_process.spawn 函数在处理复杂命令行参数时遇到的常见问题,特别是当参数包含路径或需要特殊解释时,可能导致目标程序(如Java)无法正确识别。通过引入 shell: true 选项,并结合正确的参数格式化,可以有效解决此类问题,同时强调了使用此选项时的安…

    2026年9月26日 • 用户投稿
    000
  • 量势而起•生态共盛•责筑未来|第三届新通话产业发展研讨会成功举办

    量势而起•生态共盛•责筑未来|第三届新通话产业发展研讨会成功举办量势而起•生态共盛•责筑未来|第三届新通话产业发展研讨会成功举办量势而起•生态共盛•责筑未来|第三届新通话产业发展研讨会成功举办量势而起•生态共盛•责筑未来|第三届新通话产业发展研讨会成功举办

    2025年9月25日,由中国信息通信研究院与中国通信企业协会联合主办的第三届新通话产业发展研讨会在北京国家会议中心顺利召开。本次会议作为中国国际信息通信展览会的重要组成部分,汇聚了来自工业和信息化部、信通院、电信运营商、设备制造商、终端厂商及行业应用企业的众多产业领袖与技术专家,围绕新通话技术的最新…

    2026年9月26日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信