1. 为什么C++需要协程?
在传统的C++开发中,我们处理异步操作通常采用回调函数或者多线程的方式。这两种方式各有其痛点:回调函数会导致"回调地狱",代码难以维护;而多线程则面临线程创建销毁开销大、线程间同步复杂等问题。
协程的出现完美解决了这些痛点。它允许我们在单线程内实现异步操作,既保持了代码的线性可读性,又避免了多线程的复杂性。想象一下,你可以像写同步代码一样写异步逻辑,这就是协程的魅力所在。
提示:协程不是线程!它更像是可以被暂停和恢复的函数,切换开销远小于线程切换。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++20协程的核心概念
2.1 协程的基本结构
一个C++20协程函数必须包含以下关键元素:
- 使用
co_await表达式暂停执行 - 使用
co_return返回结果 - 使用
co_yield生成值
典型的协程函数声明如下:
cpp复制#include <coroutine>
using namespace std;
generator<int> count_to_ten() {
for(int i=1; i<=10; ++i) {
co_yield i; // 每次调用生成一个值并暂停
}
}
2.2 协程的三个状态
- 挂起状态(Suspended):协程暂停执行,等待恢复
- 运行状态(Running):协程正在执行
- 终止状态(Terminated):协程执行完毕
2.3 协程的底层机制
C++20协程的实现依赖于几个关键类型:
promise_type:控制协程的行为和返回值coroutine_handle:用于恢复挂起的协程awaiter:定义co_await的行为
3. 手把手实现第一个协程
3.1 环境准备
首先确保你的编译器支持C++20:
- GCC 10+
- Clang 10+
- MSVC 19.28+
在CMake中启用C++20:
cmake复制set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
3.2 实现一个生成器协程
下面我们实现一个简单的
