C++20 引入了无栈协程,为异步编程提供了语言级支持。与传统的回调或线程模式不同,协程允许以同步的方式编写异步代码,代码逻辑更加清晰。
三个关键字
C++20 协程通过三个关键字实现:
- co_await:挂起当前协程,等待某个操作完成。
- co_yield:挂起协程并返回一个值,用于生成器。
- co_return:协程的返回语句。
协程框架
C++20 只提供了协程的底层机制,没有提供高级抽象。要使用协程,需要理解 promise_type、handle 和 awaiter 这三个核心组件:
- promise_type:控制协程行为——初始挂起、最终挂起、返回值处理。
- handle:协程的句柄,用于恢复或销毁协程。
- awaiter:定义挂起/恢复的具体逻辑。
struct Task {
struct promise_type {
Task get_return_object() { return {}; }
std::suspend_never initial_suspend() { return {}; }
std::suspend_never final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
};
Task asyncOperation() {
co_await some_async_call();
co_return;
}
适用场景
协程特别适合 IO 密集型场景:网络请求、文件操作、事件驱动编程。配合 asio 或自定义调度器,可以构建高性能异步系统。
协程让异步代码读起来像同步代码——复杂度被优雅地隐藏在了框架层。