协程是一个可以多次调用并返回的函数,它具有自己的状态,并且能够在挂起和恢复执行之间保持这个状态。
1、协程的特点:
- 轻量级:协程比线程更加轻量级,因为它们完全在用户态执行,不需要进行系统内核上的上下文切换。
- 性能优势:由于协程避免了昂贵的上下文切换,它们可以带来性能的大幅提升。
- 用户态调度:协程的上下文切换是由开发人员控制的,这意味着它们是协作式调度的用户态线程。
- 适用场景:协程适合于实现合作式多任务、迭代器、无限列表和管道等程序组件。
2、协程的优势和适用场景:
- C++20协程提供了一种以同步的方式编写异步代码的方法,这有助于提高代码的可读性和编写效率。
- 它们特别适合于需要处理大量IO操作的场景,如网络编程、文件处理等。
3、关于协程的一些词汇:
- 有栈协程(Stackful Coroutines):有栈协程使用独立的调用栈来维护每个协程的执行状态。这意味着每个协程都有自己的一套寄存器和栈空间,可以在任何时刻被挂起和恢复执行,而不影响其他协程。这种实现方式使得有栈协程在切换上下文时开销较大,因为它们需要保存和恢复较多的状态信息。有栈协程通常通过用户态线程库来实现,允许开发者在堆上模拟出协程的栈空间。
- 无栈协程(Stackless Coroutines):无栈协程不使用独立的调用栈,而是依赖程序的主调用栈。当一个函数执行时,它不会像传统函数那样在调用栈中创建新的栈帧,而是在同一个栈帧内运行,通过编译器或解释器的支持来管理局部变量和控制流。无栈协程的切换开销较小,但编写和理解它们可能需要更深入的语言特性知识。
- 对称协程(Symmetric Coroutines):在对称协程模型中,任意一个协程都可以直接转移控制权给另一个协程,控制权转移是双向的。这种模型通常要求协程间有明确的控制转移关系,编程模型相对直观。
- 非对称协程(Asymmetric Coroutines):非对称协程则是指协程之间的控制转移不是对等的。通常情况下,有一个调度器负责管理所有协程的执行顺序,协程之间并不直接传递控制。非对称协程更容易管理和优化,因为所有的调度逻辑都集中在调度器中。
4、C++20中的协程
- 非对称性:C++20协程是非对称的,这意味着协程与特定的调用者绑定,当协程让出CPU时,只能让回给原调用者。
- 无栈性:C++20协程是无栈的,它们通过主动返回结果给caller来挂起执行流;恢复执行流继续执行所需要的数据将被存储在堆上。
- 一等对象:C++20协程是一等对象,可以在程序中像其他对象一样被传递和操作。