通八洲科技

c++协程的底层实现 c++对称与非对称协程【原理】

日期:2025-12-31 00:00 / 作者:冰火之心
C++20协程是编译器支持+标准库协作的非对称协程机制,核心为promise、awaiter和coroutine_handle三要素,底层基于状态机与stackless协程帧,不提供对称跳转原语。

协程在 C++20 中是通过编译器支持 + 标准库协作实现的,它不是语言内置的“运行时调度器”,而是一套可挂起、可恢复的函数机制,其底层本质是状态机 + 堆栈管理 + 编译器生成的控制流跳转代码。C++ 标准只定义了非对称协程(asymmetric coroutine),所谓“对称协程”在标准中并不存在,是其他语言(如 Kotlin、Go)或第三方库(如 libco、Boost.Coroutine2)的概念,需自行模拟。

协程的核心三要素:promise、awaiter、coroutine_handle

C++ 协程的可挂起行为由三个关键组件协同完成:

协程帧(coroutine frame):编译器生成的状态机内存布局

当你声明一个 co_await / co_yield / co_return 的函数时,编译器会:

非对称协程:单向控制流与明确的挂起/恢复语义

C++20 协程是典型的非对称设计:

谓“对称协程”在 C++ 中如何模拟?

标准不提供,但可通过以下方式逼近: