协程是 C++20 为异步编程提供的核心语言特性,它通过把函数挂起和恢复的状态信息自动保存到堆栈之外的对象,从而实现了轻量级的异步任务。其核心语法是 co_await、co_yield 与 co_return,与普通函数区别在于它们会在遇到挂起点时把控制权交还给调用者,等到下一次被唤醒时继续执行。协程本质上是一个生成器,它的状态机由编译器生成,编译器会把协程函数拆分成若干段代码,并为每段生成相应的状态保存与恢复逻辑。协程对象本身实现了 std::suspend_always / std::suspend_never 等挂起策略,决定是否在开始时挂起。
使用协程可以简化异步 I/O、生成器模式、事件驱动等场景。举个典型例子,使用 co_await std::experimental::make_ready_future 可以让异步 I/O 操作像同步代码一样书写,极大提高可读性。协程也能与 std::generator 结合,用于惰性求值,如生成斐波那契数列时仅在需要时计算下一项。另一个应用是基于协程的协作式多任务调度,类似 boost::asio 的 io_context,但不需要线程同步,降低并发实现的复杂度。
实现协程时需要注意两点:一是协程返回值的生命周期,协程对象会在其生命周期结束时销毁内部状态;二是挂起点的选择,过多的挂起会导致性能下降。合理规划协程的入口与出口,尽量将长时间计算拆分为多段,或在 IO 等待期间挂起,可获得更好的性能与可伸缩性。
综上所述,C++20 协程为异步编程提供了强大而简洁的工具,理解其底层生成器机制和挂起策略后,可以在多种应用场景中显著提升代码质量与执行效率。