0

0

c++如何实现一个简单的协程调度器_c++深入理解C++20协程

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-11-29 15:51:05

|

950人浏览过

|

来源于php中文网

原创

实现C++20协程调度器需定义Task及promise_type,通过initial_suspend和final_suspend控制执行;2. Task封装coroutine_handle,调度器用队列管理并依次恢复协程执行。

c++如何实现一个简单的协程调度器_c++深入理解c++20协程

实现一个简单的协程调度器需要理解 C++20 协程的核心机制:可等待对象(awaiter)、协程句柄(coroutine_handle)和协程帧的生命周期管理。C++20 的协程是无协程,依赖编译器生成状态机,我们通过自定义返回类型控制其行为。

协程基础组件

要让函数成为协程,必须使用 co_awaitco_yieldco_return。协程的返回类型需满足特定要求,包含 promise_type

定义一个简单的协程返回类型:

struct Task {
    struct promise_type {
        Task get_return_object() { return {}; }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        void return_void() {}
        void unhandled_exception() {}
    };
};

其中:

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

  • initial_suspend 返回 suspend_always 表示协程创建后暂停,不立即执行
  • final_suspend 控制协程结束后是否挂起,用于防止资源提前释放

实现调度器核心

调度器负责管理多个协程的挂起与恢复。基本思路是将挂起的协程句柄存入队列,之后主动唤醒。

故事AI绘图神器
故事AI绘图神器

文本生成图文视频的AI工具,无需配音,无需剪辑,快速成片,角色固定。

下载

扩展 Task 支持获取协程句柄:

struct Task {
    struct promise_type;
    std::coroutine_handle handle;

    explicit Task(std::coroutine_handle h) : handle(h) {}

    ~Task() {
        if (handle) handle.destroy();
    }

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

    struct promise_type {
        Task get_return_object() {
            return Task{std::coroutine_handle::from_promise(*this)};
        }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        void return_void() {}
        void unhandled_exception() {}
    };
};

任务队列与运行

调度器维护一个待执行的协程队列:

class Scheduler {
public:
    void enqueue(Task task) {
        if (task.handle) {
            tasks.push(std::move(task.handle));
        }
    }

    void run() {
        while (!tasks.empty()) {
            auto handle = std::move(tasks.front());
            tasks.pop();
            if (handle.done()) continue;
            handle.resume();
        }
    }

private:
    std::queue> tasks;
};

使用示例:

Task myCoroutine(Scheduler& sched) {
    std::cout << "协程开始\n";
    co_await std::suspend_always{};
    std::cout << "协程恢复\n";
}

// 调用
Scheduler sched;
sched.enqueue(myCoroutine(sched));
sched.run(); // 输出两次

关键注意事项

  • 协程句柄必须妥善管理生命周期,避免悬空调用
  • 挂起点的选择影响并发模型,suspend_always 适合手动调度
  • 实际项目中可结合 future/promise 模式传递结果
  • 错误处理应在 unhandled_exception 中捕获并重新抛出

基本上就这些。C++20 协程灵活但细节多,重点掌握 promise 和 awaiter 的交互逻辑。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

392

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

promise的用法
promise的用法

“promise” 是一种用于处理异步操作的编程概念,它可以用来表示一个异步操作的最终结果。Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。Promise的用法主要包括构造函数、实例方法(then、catch、finally)和状态转换。

299

2023.10.12

html文本框类型介绍
html文本框类型介绍

html文本框类型有单行文本框、密码文本框、数字文本框、日期文本框、时间文本框、文件上传文本框、多行文本框等等。详细介绍:1、单行文本框是最常见的文本框类型,用于接受单行文本输入,用户可以在文本框中输入任意文本,例如用户名、密码、电子邮件地址等;2、密码文本框用于接受密码输入,用户在输入密码时,文本框中的内容会被隐藏,以保护用户的隐私;3、数字文本框等等。

400

2023.10.12

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

13

2026.01.20

PS使用蒙版相关教程
PS使用蒙版相关教程

本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

60

2026.01.19

java用途介绍
java用途介绍

本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

87

2026.01.19

java输出数组相关教程
java输出数组相关教程

本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.19

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号