C++ 语言特性31 - 协程介绍(2)
一:协程是什么?
如果你还不熟悉协程的概念,可以先将它理解为一种“更高级的函数”——它不仅能像普通函数那样被调用,还具备挂起与恢复执行的能力,从而更灵活地处理异步操作、数据生成和复杂流程控制。
二:为什么需要协程
在程序设计的发展中,函数作为最基本的抽象单元,用于组织逻辑、管理流程和提升代码可维护性。然而,传统函数具备固定入口出口、线性执行、局部状态不保留等特点,限制了它在处理复杂场景时的表达能力。面对如数据生成器、异步并发、事件驱动状态机、游戏逻辑控制等需求,传统函数显得力不从心。这时,我们需要一种能够中断与恢复执行、保持状态的更强抽象 —— 协程(coroutines)。
协程并非 C++20 的专利,其概念早在 1963 年就由Melvin Conway提出。他在关于编译器构造的论文中首次提出了“协程”这一术语,用于描述可以“交替执行”的两个过程。后来,计算机科学大师 Donald Knuth 评价说:“过程(procedure)其实只是协程的一种特例。”这表明在更高层次的抽象上,协程比传统过程更为灵活。此后,协程被广泛用于:
-
Simula(第一个面向对象语言);
-
Lua(以协程为核心特性的脚本语言);
-
Python(从 2.5 版本开始支持生成器和 yield,3.5 引入 async/await);
-
JavaScript(ES6 引入 generator,ES7 引入 async/await);
-
Rust、Kotlin、Go 等现代语言也纷纷引入协程模型;
如今,C++ 终于在 C++20 中正式支持协程,将其纳入语言级支持,使得这一概念在性能和类型安全要求极高的系统编程领域也可广泛使用。
三:C++函数的演进过程
自从 1972 年第一个 C 标准发布以来,我们就有了基本的函数,例如:func1
。
int func1() {return 1972;
}
随着 1998 年第一个 C++ 标准的到来,函数变得更加强大,我们获得了:
-
函数重载:
func2
int func2(int arg) {return arg;
}double func2(double arg) {return arg;
}