协程是用户态可挂起恢复的函数,C++20采用无栈协程,编译器将其重写为状态机;需含co_await/co_yield/co_return之一,返回类型须定义promise_type以支持协程协议。
协程不是线程,也不依赖操作系统调度;它是用户态的、可挂起和恢复的函数,适合写异步 I/O、生成器、状态机等逻辑清晰但传统回调写法容易嵌套过深的场景。C++20 的协程是无栈协程(stackless),编译器会将协程函数重写为状态机,由你控制内存布局和执行时机。
一个函数要成为协程,必须在函数体中至少出现以下任一关键词:
只要用了其中一个,编译器就按协程处理——自动改写函数签名、生成 promise 对象、管理状态机。注意:函数返回类型必须满足特定要求(见下一步)。
协程函数的返回类型(比如 Generator
标准库没提供通用协程类型,你需要自己定义(或使用第三方如 cppcoro)。初学建议从简单生成器入手。
下面是最小可行示例,实现一个每次调用 next() 返回下一个斐波那契数的协程:
templateclass Generator { struct promise_type; using handle_type = std::coroutine_handle handle_type h_; public: Generator(handle_type h) : h_(h) {} Generator(Generator&& g) noexcept : h_(std::exchange(g.h_, {})) {} ~Generator() { if (h_) h_.destroy(); } T next() { h_.resume(); return h_.promise().current_value; } struct promise_type { T current_value; std::suspend_always initial_suspend() { return {}; } std::suspend_always final_suspend() noexcept { return {}; } Generator get_return_object() { return Generator{handle_type::from_promise(*this)}; } void return_void() {} void unhandled_exception() { std::terminate(); } std::suspend_always yield_value(T value) { current_value = value; return {}; } }; }; // 协程函数 Generator fibonacci() { int a = 0, b = 1; co_yield a; co_yield b; while (true) { int next = a + b; co_yield next; a = b; b = next; } }
使用方式:
auto gen = fibonacci();
for (int i = 0; i < 10; ++i) {
std::cout << gen.next() << " "; // 输出前10个斐波那契数
}
—— 自定义 awaiter 的核心三接口当你写 co_await expr,expr 类型需提供:
这是实现异步 I/O 的入口。例如封装一个 sleep_for awaiter,内部用 std::thread::sleep_for + std::jthread 或定时器唤醒 handle,就能写出 co_await sleep_for(500ms) 这样的代码。
不复杂但容易忽略:协程对象的内存必须手动管理(或用智能指针包装 handle),且 promise 对象默认分配在协程帧中(栈上),若需跨 suspend 持久化,得重载 operator new 做堆分配。
# 操作系统
# 栈
# ai
# c++
# 标准库
# 封装
# bool
# int
# 指针
# 接口
# 堆
# operator
# 线程
# Thread
# 对象
# promise
# 异步
# 关键词
# 挂起
# 自定义
# 重写
# 回调
# 这是
# 也不
# 就能
# 句柄
# 将其
相关文章:
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
建站之星导航如何优化提升用户体验?
Android自定义控件实现温度旋转按钮效果
,如何利用word制作宣传手册?
北京企业网站设计制作公司,北京铁路集团官方网站?
如何用狗爹虚拟主机快速搭建网站?
ui设计制作网站有哪些,手机UI设计网址吗?
如何实现建站之星域名转发设置?
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
建站之星上传入口如何快速找到?
浅谈Javascript中的Label语句
如何在云主机上快速搭建多站点网站?
如何零基础开发自助建站系统?完整教程解析
如何在香港服务器上快速搭建免备案网站?
建站之星后台密码遗忘或太弱?如何重置与强化?
江苏网站制作公司有哪些,江苏书法考级官方网站?
建站168自助建站系统:快速模板定制与SEO优化指南
如何快速搭建虚拟主机网站?新手必看指南
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
如何注册花生壳免费域名并搭建个人网站?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
内网网站制作软件,内网的网站如何发布到外网?
建站之星后台密码遗忘如何找回?
如何在阿里云虚拟主机上快速搭建个人网站?
如何选择CMS系统实现快速建站与SEO优化?
,sp开头的版面叫什么?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
股票网站制作软件,网上股票怎么开户?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
高防服务器如何保障网站安全无虞?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
临沂网站制作公司有哪些,临沂第四中学官网?
建站主机选虚拟主机还是云服务器更好?
如何通过wdcp面板快速创建网站?
javascript基本数据类型及类型检测常用方法小结
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
智能起名网站制作软件有哪些,制作logo的软件?
北京网站制作公司哪家好一点,北京租房网站有哪些?
建站之星图片链接生成指南:自助建站与智能设计教程
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
建站之星北京办公室:智能建站系统与小程序生成方案解析
如何通过FTP空间快速搭建安全高效网站?
如何构建满足综合性能需求的优质建站方案?
建站之星多图banner生成与模板自定义指南
如何在腾讯云服务器上快速搭建个人网站?
如何用wdcp快速搭建高效网站?
已有域名和空间,如何快速搭建网站?
如何配置FTP站点权限与安全设置?
简历在线制作网站免费版,如何创建个人简历?
*请认真填写需求信息,我们会在24小时内与您取得联系。