C++20 Coroutines(协程)核心机制与用法
请说明C++20协程(Coroutines)的核心概念,包括co_await、co_yield、co_return关键字、promise_type框架、awaitable与awaiter接口,以及协程相对于线程的优势与使用场景。
回答
我还是少年
C++20协程是栈式可暂停/恢复的函数,非抢占式(主动让出控制权)。
核心关键字:
co_await expr:暂停当前协程,等待expr完成(线程不阻塞)。co_yield value:向调用者返回一个值并暂停,等价于co_await promise.yield_value(value)。co_return value:返回并结束协程。
协程框架:每个协程需要一个配套的promise_type(编译器通过模板推导):
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 v) { current_value = v; return std::suspend_always{}; }
void return_void() {}
};
// ... iterator访问
};
vs 线程:
- 协程在用户态切换(毫秒级/微秒级),无系统调用和上下文切换开销。
- 协程共享线程栈,适合大量并发I/O任务。
- 生成器、惰性求值、异步I/O等场景。
注意:C++20协程是框架级特性,标准库只提供基础设施,第三方库(如cppcoro)提供实用Awaitable类型。