0

0

C++怎么使用协程_C++20协程基础入门【异步】

穿越時空

穿越時空

发布时间:2026-02-23 01:41:19

|

211人浏览过

|

来源于php中文网

原创

c++20协程不自动并发,需配合调度器或awaitable封装才能实现异步;其核心是promise_type控制行为,co_await用于等待、co_yield仅用于generator;编译器支持与abi存在差异,调试和发布需注意细节。

c++怎么使用协程_c++20协程基础入门【异步】

协程不是线程,co_await 不会自动并发

很多人一看到“协程”就默认能并行跑任务,结果发现 co_await 之后代码还是顺序执行,甚至比普通函数还慢。这是因为 C++20 协程本身不带调度器——它只提供挂起/恢复的机制,不负责把协程扔给线程池或事件循环。

真正异步,得靠你选的 executor 或库(比如 std::executionlibunifexcppcoro),或者自己写一个简单的轮询器。标准库目前只提供底层协程支持(promise_typeco_awaitco_return),没给现成的 asyncTask 类型。

  • 别直接在主线程里 co_await 一个耗时 I/O 操作,除非你有配套的 awaitable 封装(比如基于 epollIOCP 的 awaiter)
  • 想模拟“异步”,最简方式是用 std::thread + std::future 包一层,但这和协程无关,只是借个壳
  • 调试时注意:协程函数返回的是一个对象(如 Task<int></int>),不是值;不 co_await 它,它根本不会运行

promise_type 是协程行为的开关,不是可选配件

所有协程函数编译后都会隐式实例化一个 promise_type,它控制协程怎么初始化、挂起、异常处理、返回值怎么包装。如果你没显式定义,编译器会尝试找默认的(比如 std::suspend_always),但多数时候找不到,直接报错:

error: no type named 'promise_type' in 'MyCoroutine'

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

常见场景是想写一个轻量 Generator<t></t>Task<t></t>,结果忘了在返回类型里嵌套定义 promise_type

易优水果蔬菜门店网站源码1.6.9
易优水果蔬菜门店网站源码1.6.9

易优cms水果蔬菜门店网站源码是基于易优cms开发,非常适合水果蔬菜基地当官网使用、 程序内核为Thinkphp5.0开发,后台简洁,为企业网站而生。 这是一套安装就能建站的c程序,不定期更新程序BUG,更新网站功能。 我们提供的不仅是模板这么简单,我们还提供程序相关咨询、协助安装等服务。 默认不包含小程序插件,需要另外单独购买插件。 模板安装步骤 1、

下载
  • 必须满足:静态成员 get_return_object()initial_suspend()final_suspend()return_value(T)(或 return_void()
  • initial_suspend() 返回 std::suspend_always 表示创建即挂起;返回 std::suspend_never 表示立即执行到第一个 co_await
  • 漏掉 unhandled_exception()?一旦协程里抛异常,程序直接 terminate

别拿 co_yieldco_await

co_yield 只用于 generator 类型(比如遍历生成器),它的语义是“产出一个值并挂起”,底层调用的是 promise.yield_value();而 co_await 是通用挂起点,依赖 await_ready/await_suspend/await_resume 三件套。

典型错误:在非 generator 协程里写 co_yield some_awaitable,编译不过,因为 promise_type 没实现 yield_value,而且语义也不对。

  • co_yield x → 等价于 promise.yield_value(x); + 挂起
  • co_await x → 触发 x.await_ready() 等三个函数,和 promise 关系间接
  • 想让协程“等一个 future”,必须用 co_await,不是 co_yield;generator 里用 co_yield 是为了迭代,不是为了等待

MSVC 和 Clang 对协程的支持细节差异真不小

Clang 15+ 默认开启协程支持(-std=c++20 -fcoroutines),而 MSVC 从 19.30 开始才稳定支持,且要求 Windows SDK ≥ 10.0.20348.0;GCC 目前(13.x)仍实验性支持,需加 -fcoroutines 且禁用 PCH。

更麻烦的是 ABI 兼容问题:不同编译器生成的协程对象内存布局不一致,跨 DLL 边界传 Task<int></int> 很可能崩溃。

  • MSVC 下 co_await 某些自定义 awaitable 时,若 await_suspend 返回 void,可能静默失败;Clang 要求必须返回 boolcoroutine_handle
  • 调试时,MSVC 的 Visual Studio 调试器对协程栈帧支持有限,常显示 “coroutine frame not available
  • 发布构建务必关掉 /Zi(PDB 调试信息),否则 MSVC 可能因协程元数据生成巨大 PDB 文件

协程真正的门槛不在语法,而在你得同时理清:promise 控制流、awaiter 状态机、调度时机、以及编译器实际生成了什么对象。少一个环节,就容易卡在“协程没执行”“值没拿到”“程序卡死”这种无提示问题上。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

371

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

341

2023.10.25

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

371

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

341

2023.10.25

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

830

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

580

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

274

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

210

2025.08.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1030

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 18.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号