c++如何用Coroutines实现一个异步生成器_c++ co_yield应用实例【C++20】

admin 百科 11
c++kquote>C++20协程通过co_yield实现懒求值生成器,核心是自定义generator返回类型及promise_type;同步示例为斐波那契数列,异步需结合co_await定时或IO操作;注意生命周期、编译选项及标准支持差异。

c++如何用Coroutines实现一个异步生成器_c++ co_yield应用实例【C++20】-第1张图片-佛山资讯网

在 C++20 中,协程(Coroutines)支持异步生成器模式,核心是通过 co_yield 暂停执行并产出值,配合自定义的协程返回类型(如 generator<t></t>)实现懒求值、按需生成的迭代器行为。它不是“异步 I/O”意义上的 async/await(那需要 executor 和 awaitable),而是“异步生成”——即调用方可以一边取值、一边让生成逻辑在后台(或分步)计算,不阻塞主线程。

1. 用 std::generator(C++26 草案)或手动实现 generator<t></t>

C++20 标准库并未提供 generator,但 MSVC 和 libc++ 已实验性支持 std::generator(C++26 提案 P2471)。若用 GCC 或需跨平台兼容,推荐手动实现一个轻量 generator<t></t>,重点在于:

  • 定义协程返回类型(含 promise_type
  • promise_type::get_return_object() 返回 generator 实例
  • promise_type::yield_value(T&& v) 保存当前值并挂起
  • generator 自带迭代器接口(begin()/end()),内部用 coroutine_handle 控制恢复

2. 基础同步生成器:斐波那契数列示例

这是理解 co_yield 最直观的例子——每次调用 ++it 触发一次恢复,产出下一个数:

generator<int> fib(int n) {
    int a = 0, b = 1;
    co_yield a;
    if (n <= 1) co_return;
    co_yield b;
    for (int i = 2; i < n; ++i) {
        int next = a + b;
        co_yield next;
        a = b;
        b = next;
    }
}

// 使用:
for (int x : fib(10)) {
    std::cout << x << " "; // 0 1 1 2 3 5 8 13 21 34
}

登录后复制

注意:co_yield 自动调用 promise_type::yield_value 并 suspend;co_return 结束协程。整个过程是同步的(无线程/await),但“按需生成”特性已具备。

立即学习“C++免费学习笔记(深入)”;

标签: 异步生成器 ai c++ 作用域 标准库

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~