讲师中心 微信公众号
AI工具推荐 视频效率加速

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

轻浩吖_4195

轻浩吖_4195

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

|

291人浏览过

|

来源于php中文网

原创

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

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

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

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

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

  • 别直接在主线程里 co_await 一个耗时 I/O 操作,除非你有配套的 awaitable 封装(比如基于 epoll 或 IOCP 的 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。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 必须满足:静态成员 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_yield 当 co_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 要求必须返回 bool 或 coroutine_handle
  • 调试时,MSVC 的 Visual Studio 调试器对协程栈帧支持有限,常显示 “coroutine frame not available”
  • 发布构建务必关掉 /Zi(PDB 调试信息),否则 MSVC 可能因协程元数据生成巨大 PDB 文件

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

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

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

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

1049

2023.10.18

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

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

3340

2023.10.25

scripterror怎么解决
scripterror怎么解决

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

1049

2023.10.18

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

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

3340

2023.10.25

string转int
string转int

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

7159

2023.08.02

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

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

3425

2024.08.29

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

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

4488

2025.08.29

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

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

3025

2025.08.29

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn