C++20协程是可挂起恢复的函数,需手动实现promise_type、awaiter和返回类型三要素;示例Generator通过co_yield实现懒加载整数生成,强调initial_suspend、final_suspend及生命周期管理。
协程不是线程,也不启动新执行流,它是一种可挂起、可恢复的函数,用于简化异步逻辑、生成器、状态机等场景。C++20 协程是语言级支持,但需要手动实现协程桩(promise type)、awaiter 和返回类型——不依赖运行时库,但也意味着不能直接“开箱即用”。
每个协程必须有:
promise_type 嵌套类,并提供 get_return_object()、initial_suspend()、final_suspend()、return_void()(或 return_value())等接口;co_await 表达式,其操作数需满足 awaiter 要求(含 await_ready()、await_suspend()、await_resume());co_return(结束协程)、co_await(挂起等待)、co_yield(挂起并产出值,常用于 generator)。下面是一个能逐次产出 0、1、2 的协程 generator(类似 Python 的 yield):
// 编译需支持 C++20:g++-11+ / clang++-13+,加 -std=c++20 #include#include #include template struct Generator { struct promise_type; using handle_type = std::coroutine_handle struct promise_type { T current_value; auto get_return_object() { return Generator{handle_type::from_promise(*this)}; } auto initial_suspend() { return std::suspend_always{}; } auto final_suspend() noexcept { return std::suspend_always{}; } void return_void() {} void unhandled_exception() { std::terminate(); } auto yield_value(T value) { current_value = value; return std::suspend_always{}; } }; explicit Generator(handle_type h) : coro_(h) {} Generator(const Generator&) = delete; Generator& operator=(const Generator&) = delete; Generator(Generator&& rhs) noexcept : coro_(rhs.coro_) { rhs.coro_ = nullptr; } Generator& operator=(Generator&& rhs) noexcept { if (this != &rhs) { if (coro_) coro_.destroy(); coro_ = rhs.coro_; rhs.coro_ = nullptr; } return *this; } ~Generator() { if (coro_) coro_.destroy(); } bool next() { if (!coro_ || coro_.done()) return false; coro_.resume(); return !coro_.done(); } T value() const { return coro_.promise().current_value; } private: handle_type coro_; }; Generator counter() { co_yield 0; co_yield 1; co_yield 2; } int main() { auto g = counter(); while (g.next()) { std::cout << g.value() << '\n'; } // 输出:0\n1\n2 }
这段代码展示了协程最核心的协作模式:

co_yield 触发 promise_type::yield_value(),保存值并挂起;Generator::next() 调用 resume() 恢复执行,直到下次挂起或结束;initial_suspend() 设为 suspend_always,让协程创建后不自动运行(惰性求值);final_suspend() 也设为 suspend_always,防止协程结束后自动销毁 promise,方便外部安全读取结果。初学容易踩坑的地方:
~Generator 中调用 coro_.destroy() → 内存泄漏;coroutine_handle)复制多次却不管理生命周期 → 悬空指针;co_await 等价于“异步等待” → 它只是语法糖,行为完全由 awaiter 决定(可以立刻返回,也可以调度到线程池);unhandled_exception() → 协程内抛异常会导致程序终止。基本上就这些。协程本身不难理解,难点在于设计清晰的协程类型契约。建议从 generator 入手,再过渡到 async/await 风格的 task 类型(如 Task),逐步掌握 suspend/resume 的控制权。
# python
# 懒加载
# ai
# c++
# ios
# stream
相关文章:
香港服务器如何优化才能显著提升网站加载速度?
活动邀请函制作网站有哪些,活动邀请函文案?
如何在Golang中指定模块版本_使用go.mod控制版本号
如何在Tomcat中配置并部署网站项目?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何用已有域名快速搭建网站?
深圳网站制作培训,深圳哪些招聘网站比较好?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
相册网站制作软件,图片上的网址怎么复制?
免费视频制作网站,更新又快又好的免费电影网站?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
广州商城建站系统开发成本与周期如何控制?
建站主机无法访问?如何排查域名与服务器问题
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
建站主机SSH密钥生成步骤及常见问题解答?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
高端网站建设与定制开发一站式解决方案 中企动力
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
制作农业网站的软件,比较好的农业网站推荐一下?
建站VPS选购需注意哪些关键参数?
家庭服务器如何搭建个人网站?
学校免费自助建站系统:智能生成+拖拽设计+多端适配
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
如何快速生成高效建站系统源代码?
建站之星如何一键生成手机站?
如何快速查询网站的真实建站时间?
开封网站制作公司,网络用语开封是什么意思?
北京网站制作网页,网站升级改版需要多久?
如何用VPS主机快速搭建个人网站?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
深圳网站制作的公司有哪些,dido官方网站?
建站之星如何防范黑客攻击与数据泄露?
免费网站制作appp,免费制作app哪个平台好?
建站之星安装后如何自定义网站颜色与字体?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
在线制作视频网站免费,都有哪些好的动漫网站?
南宁网站建设制作定制,南宁网站建设可以定制吗?
制作网站怎么制作,*游戏网站怎么搭建?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
Android自定义控件实现温度旋转按钮效果
c++怎么用jemalloc c++替换默认内存分配器【性能】
建站之星ASP如何实现CMS高效搭建与安全管理?
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
焦点电影公司作品,电影焦点结局是什么?
如何自定义建站之星网站的导航菜单样式?
如何基于PHP生成高效IDC网络公司建站源码?
网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?
*请认真填写需求信息,我们会在24小时内与您取得联系。