C++协程coroutine怎么用

阿敏同学_6269

阿敏同学_6269

2026-10-29

829人浏览

原创

C++20协程需编译器支持(GCC 10+/Clang 13+/MSVC 19.28+)并启用对应标志,核心是自定义返回类型含promise_type及四个必重载函数,配合awaitable三函数实现co_await,且需手动管理内存与生命周期。

c++协程coroutine怎么用

coroutine是C++20标准特性,不是第三方库

它需要编译器显式支持(GCC 10+、Clang 13+、MSVC 19.28+),且默认不开启。光有语法糖 co_await、co_yield、co_return 不代表能跑起来——缺了 promise_type 定义和内存分配器配合,编译直接报错。

常见错误现象:error: 'co_await' cannot be used in a function that does not return a coroutine type,本质是返回类型没满足“可挂起”要求(即没有嵌套合法的 promise_type)。

  • 必须用 -std=c++20 编译,GCC/Clang 还要加 -fcoroutines
  • MSVC 需要 /std:c++20 /await,且项目属性里启用“C++协程支持”
  • 返回类型不能是内置类型或普通类;得是自定义类型,且该类型内必须定义 promise_type 结构体

最简可用的 generator 实现要点

想写一个能 co_yield 整数并用 for-range 遍历的生成器?重点不在 co_yield 本身,而在 promise_type::get_return_object()、initial_suspend()、final_suspend() 和 unhandled_exception() 这四个必重载函数。

容易踩的坑:漏掉 final_suspend() 返回 suspend_always{},会导致协程销毁时试图 resume 已释放的栈帧,引发未定义行为。

  • get_return_object() 必须返回一个能持有协程句柄(std::coroutine_handle)的对象
  • initial_suspend() 若返回 suspend_always{},协程创建后不立即执行,适合懒求值;返回 suspend_never{} 则立刻跑——但注意异常可能在构造时抛出
  • yield_value(int v) 负责把 co_yield v 的值存到 generator 对象里(比如成员变量 current_value),并返回 suspend_always{} 挂起
  • 别忘了 operator bool() 和 operator++() 等迭代器协议接口,否则 for-range 无法识别

co_await 等待的是 awaitable,不是任意对象

你不能对 std::future 直接 co_await——它没实现 await_ready()、await_suspend()、await_resume() 这三个成员函数。C++20 协程的等待机制是“鸭子类型”,靠编译期查这三者是否存在来决定能否 co_await。

C++14
C++14

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

下载

典型场景:封装异步 I/O 或定时器。比如想等 100ms:co_await std::chrono::milliseconds{100} 是非法的;必须包装成一个 awaitable 类型(如 sleep_for_awaitable)。

  • 第三方库如 libunifex、cppcoro 提供了开箱即用的 awaitable(cppcoro::timer、cppcoro::task)
  • 自己写 awaitable 时,await_suspend() 接收 std::coroutine_handle,你要负责把它保存起来,并在条件满足时调用 resume()
  • 若 await_ready() 返回 true,await_suspend() 根本不会被调用——这是零开销优化的关键点

协程栈与内存管理必须手动控制

C++ 协程默认使用堆分配(调用 operator new 分配 promise 对象),且无自动回收机制。如果协程长期存活又没被显式销毁,就会泄漏。更麻烦的是:协程挂起时,局部变量存在 promise 对象里,不是栈上——所以不要在协程函数里取局部变量地址并跨挂起点使用。

性能影响明显:每次 co_await 涉及一次潜在的堆分配 + 虚函数调用(await_suspend);频繁短生命周期协程比线程/回调更重。

  • 可通过重载 promise_type 的 operator new/delete 使用对象池或栈内存(需确保生命周期可控)
  • 不要在 co_yield 后继续用之前栈变量的引用或指针——它们可能已被析构
  • 调试困难:GDB/LLDB 对协程帧支持有限,bt 可能只显示 coroutine_handle::resume,看不到原始调用链

真正难的不是写第一个 co_yield,而是设计 promise_type 的状态流转、资源归属和取消逻辑。多数人卡在 suspend/resume 的时机不对,或者 awaitable 的 resume 调用遗漏——这些错误不报编译错误,只导致协程永远挂起或崩溃。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2268

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

1039

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

447

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

327

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

426

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

600

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1429

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1237

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习