此文翻译自:COROUTINES INTRODUCTION
在很长时间的争论,反对和准备后,WG21(ISO C++ Committee) 统一了在C++20中coroutines (协程)的具体实现。这是一个巨大的feature,我们需要提前学习。
有很多人反对这个特性,很多人抱怨协程很难懂以及性能可能不是最佳–动态内存分配没有优化(possibly ?)。
有些人甚至打算根据 TS (officially published Technical Specifications) 自己实现协程机制。我们这里讨论的协程是TS(技术规范)中的协程,是由微软提供的解决方案。
协程介绍
协程已经在很多语言中存在了,比如说Python和C#。协程提供了另一种创建异步代码的方法。我们会介绍协程与线程的区别,以及协程的优点。
协程有很多不同的叫法:
- stackless coroutines
- stackful coroutines
- green threads
- fibers
- goroutines
一般来说stackful coroutines, green threads, fibers, goroutines是同一个意思(有时有区别),我们称这些为 fibers 或者 stackful coroutines。但stackless coroutines有一些特殊,我们会重点讨论。
为了理解协程,我们先介绍一下函数。
void foo(){
return; //here we exit the function
}
foo(); //here we call/start the function
在我们调用函数之后,我们无法暂停或恢复它。我们可以执行的函数的唯一操作是start和finish。一旦功能启动,我们必须等到它完成。如果我们再次调用该函数,它将从头开始执行。
但对于协程来说不一样,你不仅可以启动和停止它,还可以暂停和恢复它。它仍然与内核的线程不同,因为协同程序本身并不是抢占式的(另一方面,协程通常属于线程,线程是抢占式的)。为了理解它,我们看一下python中定义的生成器。虽然Python叫它生成器,但在C ++中被称为coroutine。示例如下:
def generate_nums():
num = 0
while True:
yield num
num = num + 1
if num > 9:
break
nums = generate_nums()
for x in nums:
print(x