Wiki
协程是什么
约 2 分钟阅读
协程(coroutine)关注的是:
一个函数如何暂停,并在之后从暂停的位置继续执行。
它是一种控制流工具,不等于线程,也不天然意味着并行。
1.一个直观理解
普通函数调用通常是:
进入函数
一直执行
返回结果
函数结束
协程更像是:
进入函数
执行一段
暂停
之后恢复
继续执行
再暂停或结束
这种能力非常适合表达异步流程。
2.协程不是线程
线程由操作系统调度,多个线程可能在多个 CPU 核心上同时运行。
协程通常是协作式的:
协程自己在合适的位置暂停
调度器再恢复其他协程
所以:
多个协程可以在一个线程里交错执行
协程本身不保证并行
如果协程背后配合线程池或异步运行时,才可能和并行执行结合起来。
3.C++ 协程的关键词
C++20 引入了语言级协程支持,常见关键词包括:
co_await:等待一个可等待对象,并可能暂停当前协程;co_yield:产生一个值,并暂停当前协程;co_return:从协程返回结果。
不过 C++ 标准库只提供了协程机制的底层能力,并没有直接提供完整的高级异步框架。
因此学习 C++ 协程时,通常还需要结合具体库或运行时理解。
4.协程适合什么场景
协程常见于:
- 异步 IO;
- 网络服务器;
- 定时任务;
- 生成器;
- 状态机;
- 需要把回调式代码写成顺序流程的场景。
5.本章后续方向
当前先预留协程概念位置。
后续如果继续补充,可以从这些问题展开:
co_await到底等待什么?- promise type 是什么?
- coroutine handle 是什么?
- generator 和 task 有什么区别?
- 协程怎样和异步 IO、线程池结合?
先理解“协程是可暂停/恢复的控制流”,再去看具体语法会容易很多。