CodeWalk

C++20 Coroutines(协程)核心机制与用法

作者:我还是少年 · 2026-05-30 12:55

请说明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类型。