C++ 20标准协同程序(协程)基于编译器展开的 stackless 协程。

文章介绍了C++中stackless协程的工作原理,强调了在项目中避免C++20标准的stackless协程的原因,并通过实例展示了如何使用co_await,co_yield,co_return等关键词实现协同程序的正确切换和数据返回。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在查阅本文之前,请先查看本人的另外一篇关于协同程序切换的文献,这对于如何正确协同程序编程很有价值。

C/C++ 如何正确的切换协同程序?(基于协程的并行架构)-CSDN博客

我本人相当反对,在项目之中使用 C++ 20标准的 stackless 无栈协程,在上述博文之中明确提到了大体的原因是什么,并且 C/C++ 越新的标准越存在不可预计的编译风险性问题,目前基本可以确保稳定的 C++ 编译器标准为 C++ 17。

stackless 协程在 C/C++ 之中是 “switch 基于步骤的状态机切换” 协同程序展开结构,即每一次 MoveNext 切换到下一个工作流片。

这就像在 C# 之中,我们使用 C# 语言的迭代器来模拟实现协程一样,首先本人提供一个简单的协同程序切换的流程,就只使用 co_await 编译器关键字,我们就可以实现一个完整的协同程序切换流程。

以下述代码为例,将直接展示 C++ 20 标准提供的 stackless 程序编译器语法支援,即三个关键字的用法例子:co_await、co_yield、co_return

在只使用 co_await 关键字的情况下实现协同程序正确切换。

例子:

#include <iostream>
#include <coroutine>

struct MyTask {
    struct promise_type {
    public:
        MyTask                                  get_return_object() {
            return MyTask{ std::coroutine_handle<promise_type>::from_promise(*this) };
        }

    public:
        std::suspend_never                      initial_suspend() noexcept { return {}; }
        std::suspend_always                     final_suspend() noexcept { return {}; }
        void                                    return_void() noexcept {}
        void                                    unhandled_exception() noexcept {}
    };

public:
    explicit MyTask(std::coroutine_handle<promise_type> coro) noexcept : coroutine(coro) {}
    ~MyTask() noexcept {
        if (coroutine) {
            coroutine.destroy();
        }
    }

public:
    bool                                        await_ready() const noexcept { return false; }
    void                                        await_suspend(std::coroutine_handle<>) const noexcept {}
    void                                        await_resume() const noexcept {}

public:
    void                                        resume() noexcept {
        coroutine.resume();
    }

private:
    std::coroutine_handle<promise_type>         coroutine;
};

MyTask fork_stackless_coroutine() noexcept {
    std::cout &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值