Skip to content

Wiki

协程是什么

About 2 min read

An English translation is not available yet. The latest Simplified Chinese source is shown without triggering paid translation.

协程(coroutine)关注的是:

一个函数如何暂停,并在之后从暂停的位置继续执行。

它是一种控制流工具,不等于线程,也不天然意味着并行。

1.一个直观理解

普通函数调用通常是:

进入函数
一直执行
返回结果
函数结束

协程更像是:

进入函数
执行一段
暂停
之后恢复
继续执行
再暂停或结束

这种能力非常适合表达异步流程。

2.协程不是线程

线程由操作系统调度,多个线程可能在多个 CPU 核心上同时运行。

协程通常是协作式的:

协程自己在合适的位置暂停
调度器再恢复其他协程

所以:

多个协程可以在一个线程里交错执行
协程本身不保证并行

如果协程背后配合线程池或异步运行时,才可能和并行执行结合起来。

3.C++ 协程的关键词

C++20 引入了语言级协程支持,常见关键词包括:

  • co_await:等待一个可等待对象,并可能暂停当前协程;
  • co_yield:产生一个值,并暂停当前协程;
  • co_return:从协程返回结果。

不过 C++ 标准库只提供了协程机制的底层能力,并没有直接提供完整的高级异步框架。

因此学习 C++ 协程时,通常还需要结合具体库或运行时理解。

4.协程适合什么场景

协程常见于:

  • 异步 IO;
  • 网络服务器;
  • 定时任务;
  • 生成器;
  • 状态机;
  • 需要把回调式代码写成顺序流程的场景。

5.本章后续方向

当前先预留协程概念位置。

后续如果继续补充,可以从这些问题展开:

  1. co_await 到底等待什么?
  2. promise type 是什么?
  3. coroutine handle 是什么?
  4. generator 和 task 有什么区别?
  5. 协程怎样和异步 IO、线程池结合?

先理解“协程是可暂停/恢复的控制流”,再去看具体语法会容易很多。