1. 为什么C++需要协程?
在传统的C++开发中,我们处理异步操作时通常面临两种选择:多线程回调或者事件循环。这两种方式都有明显的局限性。多线程回调会导致"回调地狱",代码可读性急剧下降;而事件循环虽然解决了回调嵌套问题,但却难以处理复杂的控制流。
我在实际项目中就遇到过这样的困境:一个需要同时处理网络IO、文件操作和用户输入的服务端程序,用传统方式写出来的代码就像一团乱麻。直到C++20引入了协程这个新特性,才真正找到了优雅的解决方案。
协程(Coroutine)是一种可以暂停和恢复执行的函数,它能在不阻塞线程的情况下实现异步编程。与线程相比,协程的切换开销极低(通常是纳秒级),一个线程可以轻松运行成千上万个协程。这使得协程成为高并发场景下的理想选择。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. C++20协程的核心概念
2.1 协程的基本结构
一个C++协程函数与普通函数在声明上几乎相同,但内部使用了三个特殊关键字:
- co_await:暂停当前协程,等待异步操作完成
- co_yield:产生一个值并暂停协程
- co_return:结束协程并返回最终结果
下面是一个最简单的协程示例:
cpp复制#include <coroutine>
#include <iostream>
struct Generator {
struct promise_type {
int current_value;
auto get_return_object() { return Generator{this}; }
auto initial_suspend() { return std::suspend_always{}; }
auto final_suspend() noexcept { return std::suspend_always{}; }
void unhandled_exception() { std::terminate(); }
auto yield_value(int value) {
current_value = value;
return std::suspend_always{};
}
};
// 其余实现代码...
};
Generator range(int from, int to) {
for(int i = from; i < to; ++i) {
co_yield i;
}
}
2.2 协程的状态机模型
理解协程的关键在于明白它本质上是一个状态机。每次协程暂停时,它的局部变量和执行位置都会被保存;当协程恢复时
