卡码笔记-最强八股文
首页
计算机基础
C++
Java
Go
🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经
简历专栏
代码随想录 (opens new window)
首页
计算机基础
C++
Java
Go
🔥大模型🔥
  • 大模型面经
  • Java面经
  • C++面经
简历专栏
代码随想录 (opens new window)
  • 本栏必读

    • 关于本专栏
    • C++学习路线
    • C++面试题系优化
  • 基础与语法

  • 面向对象

  • STL 与容器

  • 内存管理

  • C++11 与现代 C++

    • C++11中的新特性有哪些
    • C++11中的多线程编程
    • 左值引用和右值引用的区别
    • 移动语义有什么作用,原理是什么
    • 完美转发的作用及实现
    • 说一下c++中stdmove与stdforward的区别
    • 说一下lambda函数
    • 仿函数与lambda性能对比
    • C++中的RAII机制
    • C++中的异常处理机制
    • C++中的协程概念及实现
      • 简要回答
      • 详细回答
      • 知识拓展
  • 智能指针

  • 并发与 I/O

# C++20协程概念及实现

面试官问:"说说 C++ 协程是什么?怎么实现的?和线程有什么区别?"

协程是 C++20 的重头戏,但很多人只知道"可以暂停恢复的函数"就答不下去了。面试官真正想听的是:协程的执行流程是什么样的、三个核心组件各自干什么、和线程到底差在哪。

# 简要回答

协程是能够暂停执行并在之后恢复的函数,C++20 通过 co_await、co_yield、co_return 三个关键字实现。

核心组件有三个:Promise 对象控制协程生命周期和返回值,Coroutine Handle 是恢复/销毁协程的句柄,Awaiter 定义 co_await 的等待行为。

和线程的本质区别:线程由操作系统内核调度,切换成本高;协程由用户态程序自己调度,切换成本极低,但不能真正并行。

# 详细回答

协程的执行流程

协程被调用时,不像普通函数那样一口气执行完。它的生命周期是这样的:

  1. 分配协程帧(堆上,存储局部变量、参数、恢复点)
  2. 创建 Promise 对象
  3. 调用 promise.get_return_object() 拿到返回给调用者的对象
  4. 执行协程体,遇到 co_await / co_yield 时暂停,控制权交还调用者
  5. 调用者通过 handle.resume() 恢复执行,或 handle.destroy() 销毁

关键点在于:协程暂停时,它的整个执行状态(局部变量、执行位置)都保存在协程帧里,恢复时从断点继续,不需要重新初始化。

协程 vs 线程 vs 回调

  • 线程:OS 内核调度,支持真正并行,但上下文切换要保存/恢复寄存器、切换栈,开销大(微秒级)
  • 协程:用户态调度,协作式多任务,切换只需要保存几个指针,开销极小(纳秒级)。但同一时刻只有一个协程在跑
  • 回调:逻辑被拆成碎片,容易回调地狱,错误处理复杂。协程用线性代码风格写异步逻辑,可读性好得多

适用场景

异步 I/O(网络请求、文件读写)、生成器(大数据集流式处理)、状态机(复杂状态转换)、游戏开发(角色行为序列)。

协程执行流程

# 知识拓展

面试官可能追问:

Q1: 协程帧里都存了什么?

Promise 对象、函数参数的副本、所有局部变量、当前挂起点的位置信息。本质上就是一个堆分配的结构体,保存了协程"冻结"时的全部状态。

Q2: co_await 表达式的三阶段流程?

await_ready() — 检查结果是否已经就绪,就绪就不用挂起了;await_suspend() — 挂起协程,把 handle 交出去让别人来恢复;await_resume() — 恢复后拿到结果继续执行。

Q3: 怎么避免协程内存泄漏?

核心是确保 coroutine_handle 一定会被 destroy。实践中用 RAII 包装器(析构时自动 destroy)、在 final_suspend 返回 suspend_always 然后由持有者负责销毁、避免 handle 的循环引用。

Q4: 协程能替代线程吗?

不能。协程解决的是"异步代码写起来难看"的问题,不是并行计算的问题。CPU 密集型任务还是得用线程/线程池,协程适合 I/O 密集型场景。

Last Updated: 5/23/2026, 4:43:00 PM

← C++中的异常处理机制 什么是智能指针,C++中有哪几种智能指针 →

评论

验证登录状态...

侧边栏 侧边栏
夜间模式 夜间
卡码简历 卡码简历
代码随想录 代码随想录
卡码投递表 卡码投递表🔥
2026实习校招群 2026群
添加客服微信 2026实习校招客服微信 PS:通过微信后,请发送姓名-学校-年级-2026实习/校招
支持卡码笔记 支持卡码笔记
鼓励/支持/赞赏Carl 卡码笔记赞赏码
1. 如果感觉本站对你很有帮助,也可以请Carl喝杯奶茶,金额大小不重要,心意已经收下
2. 希望大家都能梦想成真,有好的前程,加油💪