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

c++中的协程awaiter和awaitable是什么_c++协程自定义与原理【C++20】

大芳酱_9790

大芳酱_9790

发布时间:2025-12-24 17:05:03

|

334人浏览过

|

来源于php中文网

原创

awaitable是可被co_await的触发器,通过operator co_await()返回awaiter;awaiter是执行挂起/恢复的执行器,需实现await_ready()、await_suspend()和await_resume()三要素。

c++中的协程awaiter和awaitable是什么_c++协程自定义与原理【c++20】

在 C++20 中,awaitable 和 awaiter 是协程(coroutine)机制的核心抽象,它们共同支撑 co_await 表达式的语义,但二者职责不同、层次分明。

awaitable:可等待对象,协程暂停的“触发器”

awaitable 不是某个具体类型,而是一类满足特定要求的对象——它能通过 operator co_await() 返回一个 awaiter。标准库中如 std::suspend_always、std::suspend_never 是最简 awaitable;自定义类型只要提供该 operator,就可被 co_await 使用。

常见写法:

  • 直接返回 awaiter 对象(如 return my_awaiter{};)
  • 返回自身并定义 operator co_await()(推荐,支持链式 await)
  • 返回代理对象(如包装 future 或 promise 的适配器)

awaiter:真正执行挂起/恢复逻辑的“执行器”

awaiter 是一个满足三要素的类型:
– 有 await_ready():返回 bool,决定是否跳过挂起(例如立即就绪时返回 true)
– 有 await_suspend(coroutine_handle<> h):决定如何挂起协程(可返回 void、bool 或另一个 coroutine_handle)
– 有 await_resume():协程恢复后执行,通常返回值(或 void),即 co_await expr 的结果

注意:await_suspend 的返回值很关键:
– 返回 void:挂起后不调度,控制权交还给调用者
– 返回 true:挂起成功,协程进入暂停状态
– 返回 false:挂起被拒绝,协程继续执行(相当于没挂起)
– 返回 coroutine_handle:将当前协程移交到该 handle 所指协程(常用于链式调度)

自定义 awaitable + awaiter 的典型流程

以实现一个延时等待为例(模拟 sleep):

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

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

  • 定义 delay_awaitable 类,含构造函数接收毫秒数
  • 在其中定义 operator co_await(),返回一个 delay_awaiter
  • delay_awaiter 存储延迟时间,并在 await_suspend 中启动定时器(如用 std::thread + std::this_thread::sleep_for,或绑定到 event loop)
  • 定时结束后,调用 resume() 恢复原协程(需保存 coroutine_handle)

关键点:awaiter 必须可移动(通常默认移动语义即可),且生命周期需覆盖挂起期间——不能在 suspend 后析构。

原理本质:编译器生成状态机 + 用户接管控制流

C++ 协程不是运行时调度器,而是编译器把函数重写为状态机(state machine)。每次 co_await 都对应一个状态跳转点。
– awaitable 是用户提供的“接入点”,告诉编译器“这里要切出去”
– awaiter 是用户写的“胶水代码”,负责决定何时切、切到哪、切回来拿什么值
– 所有调度逻辑(线程切换、事件循环唤醒、异常传播等)均由 awaiter 显式控制,标准库不内置调度器

这意味着:C++20 协程轻量、零成本抽象,但也意味着你得自己处理线程安全、内存生命周期、错误传播等——它提供的是能力,不是开箱即用的 async/await。

基本上就这些。理解 awaitable 是“谁可以被等”,awaiter 是“怎么等、等完干啥”,就能稳住协程自定义的主干逻辑。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

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

下载

相关标签:

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

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

WorkBuddy

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

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

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

豆包大模型

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

火山引擎

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

相关专题

更多
javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

636

2023.11.23

java中void的含义
java中void的含义

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

351

2025.11.27

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3858

2023.08.10

Java 并发编程高级实践
Java 并发编程高级实践

本专题深入讲解 Java 在高并发开发中的核心技术,涵盖线程模型、Thread 与 Runnable、Lock 与 synchronized、原子类、并发容器、线程池(Executor 框架)、阻塞队列、并发工具类(CountDownLatch、Semaphore)、以及高并发系统设计中的关键策略。通过实战案例帮助学习者全面掌握构建高性能并发应用的工程能力。

543

2025.12.01

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

4240

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

3583

2023.10.12

FrankenPHP集成Laravel详细教程
FrankenPHP集成Laravel详细教程

本专题提供FrankenPHP集成Laravel的详细配置指南,全面解析运行原理、开发环境搭建、Caddyfile配置、Octane工作模式、数据库连接、队列任务、定时任务和生产环境优化,解决部署过程中常见的报错与兼容性问题。

0

2026.10.08

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

120

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

100

2026.09.30

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
安装 Xdebug 并配置 phpstorm
安装 Xdebug 并配置 phpstorm

共1课时 | 185人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 20.4万人学习

好课诞生记
好课诞生记

共20课时 | 7.1万人学习

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

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