C++20协程是编译器支持的协作式执行机制,通过co_await、co_yield、co_return识别,需自定义返回类型及promise_type,并遵循awaiter协议实现挂起与恢复。
C++20协程不是“线程”或“语法糖”,而是一套编译器支持的、用户可定制的协作式执行机制。它让函数能中途暂停、保存状态、稍后从中断点恢复,整个过程不依赖操作系统调度,开销远低于线程,也比回调嵌套更直观。
只要函数体内出现以下任意一个,编译器就把它当作协程:
协程不能直接返回 int 或 void,必须返回一个自定义类型(如 task、generator),且该类型内部要嵌套定义 promise_type。
promise_type 是协程行为的“控制中心”,至少需实现:
task{handle});suspend_never),还是先挂起(suspend_always);co_return 的值;std::terminate 或记录)。co_await expr 不是直接等系统调用,而是要求 expr 类型满足 awaiter 接口:
co_await 表达式的值。
不用第三方库,也能跑通基本流程:
struct task {
struct promise_type {
task get_return_object() { return {}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
};
task my_coro() {
std::cout << "start\n";
co_await std::suspend_always{}; // 主动挂起一次
std::cout << "resumed\n";
co_return;
}
调用后协程立即执行到 co_await 挂起;之后需手动调用 coroutine_handle::resume() 才会继续——这就是“可控暂停”的本质。