You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否简化C++协程示例?C++23是否有内置默认promise_type?

关于C协程示例简化与C23内置promise_type的解答

一、可进一步简化的纯协程示例

要展示交错执行与主动调度,核心需保留协程挂起、外部持有句柄、主动resume三个要素。以下是极致简化的实现,去掉冗余封装,直接暴露核心逻辑:

#include <coroutine>
#include <iostream>

// 极简协程返回类型,嵌套promise_type
struct SimpleTask {
    struct promise_type {
        // 返回当前任务实例
        SimpleTask get_return_object() { return {}; }
        // 协程启动时不挂起
        std::suspend_never initial_suspend() { return {}; }
        // 协程结束时挂起,避免自动销毁句柄
        std::suspend_always final_suspend() noexcept { return {}; }
        // 无返回值处理
        void return_void() {}
        // 异常处理(极简版直接终止)
        void unhandled_exception() { std::terminate(); }

        // 自定义awaiter:强制挂起,保存协程句柄供外部调度
        struct SuspendForSchedule {
            bool await_ready() const noexcept { return false; }
            void await_suspend(std::coroutine_handle<> h) {
                stored_handle = h;
            }
            void await_resume() noexcept {}

            static inline std::coroutine_handle<> stored_handle;
        };
    };
};

// 示例协程1
SimpleTask coroA() {
    std::cout << "CoroA: 执行第一步\n";
    co_await SimpleTask::promise_type::SuspendForSchedule{};
    std::cout << "CoroA: 执行第二步\n";
}

// 示例协程2
SimpleTask coroB() {
    std::cout << "CoroB: 执行第一步\n";
    co_await SimpleTask::promise_type::SuspendForSchedule{};
    std::cout << "CoroB: 执行第二步\n";
}

int main() {
    // 启动协程,获取挂起后的句柄
    coroA();
    auto handleA = SimpleTask::promise_type::SuspendForSchedule::stored_handle;
    coroB();
    auto handleB = SimpleTask::promise_type::SuspendForSchedule::stored_handle;

    // 主动调度,实现交错执行
    handleA.resume(); // 继续执行coroA第二步
    handleB.resume(); // 继续执行coroB第二步

    // 销毁协程句柄
    handleA.destroy();
    handleB.destroy();
    return 0;
}

简化要点:

  • 去掉额外的任务句柄封装,直接用static成员存储协程句柄
  • 仅保留协程运行必需的promise_type成员函数
  • 用最简的自定义awaiter实现主动挂起与调度入口

执行后输出:

CoroA: 执行第一步
CoroB: 执行第一步
CoroA: 执行第二步
CoroB: 执行第二步

清晰展示了两个协程的交错执行逻辑。

二、C++23中是否存在内置默认promise_type?

没有。C++23标准并未提供通用的内置promise_type。所有用户自定义的协程返回类型,必须通过以下两种方式关联promise_type:

  1. 在返回类型中嵌套定义promise_type结构体(如上述示例)
  2. 特化std::coroutine_traits模板,为返回类型指定对应的promise_type

标准库提供的std::generator等组件,是封装了各自promise_type的协程适配器,但不属于“内置默认promise_type”范畴。纯手写协程时,必须自行定义promise_type来控制协程行为。

内容的提问来源于stack exchange,提问作者Gonen I

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:25:04