C++20协程自定义完全实践(从promise_type开始的高阶技巧)

第一章:C++20协程与promise_type核心概念

C++20引入了原生协程支持,为异步编程提供了语言层面的基础设施。协程的核心机制依赖于三个关键组件:`co_await`、`co_yield` 和 `co_return`,以及一个可定制的 `promise_type` 类型。当函数中使用了上述关键字之一时,编译器会将其转换为状态机,并通过 `promise_type` 管理协程的生命周期和行为。

协程的基本结构

每个协程返回类型必须包含一个嵌套的 `promise_type`,该类型决定了协程如何启动、暂停、返回值处理及最终销毁。编译器在协程初始化阶段会自动创建 `promise_type` 实例,并调用其特定成员函数。
  • get_return_object():创建并返回协程句柄
  • initial_suspend():决定协程是否立即开始执行或挂起
  • final_suspend():定义协程结束时的行为
  • return_value(T) 或 return_void():处理返回值
  • unhandled_exception():异常处理路径

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() {}
    };
};
上述代码定义了一个最简化的协程返回类型 `Task` 及其 `promise_type`。其中 `std::suspend_always` 表示协程在开始和结束时都会挂起,允许外部控制恢复时机。

协程执行流程控制

阶段调用方法作用
创建get_return_object生成协程返回对象
启动initial_suspend决定是否立即运行
结束final_suspend控制协程终止行为
通过自定义 `promise_type`,开发者可以精确控制协程的行为,实现延迟执行、链式调用或资源清理等高级模式。

第二章:promise_type基础结构与编译器交互机制

2.1 理解协程框架:compiler、promise、awaiter三者关系

在C++20协程中,编译器(compiler)、promise对象和awaiter三者协同工作以实现异步逻辑的挂起与恢复。
核心组件职责
  • Compiler:识别协程关键字(如co_await),生成状态机代码
  • Promise:定义协程行为接口,控制结果返回与异常处理
  • Awaiter:决定是否挂起、恢复及返回值类型
执行流程示例
suspend_always await_ready() { return false; }
void await_suspend(coroutine_handle<> h) { /* 恢复目标 */ }
int await_resume() { return 42; }
上述awaiter使协程始终挂起,await_suspend传入handle用于后续恢复,await_resume定义恢复后返回值。
组件输入输出
Compilerco_await expr调用expr.operator co_await()
Promiseget_return_object()构造协程返回值
Awaiterawait_ready决定是否同步执行

2.2 promise_type必需成员函数的语义与实现

在C++协程中,promise_type是协程行为控制的核心。它必须提供若干特定成员函数以满足编译器生成代码的调用需求。
必需成员函数列表
  • get_return_object():创建并返回协程句柄
  • initial_suspend():决定协程启动时是否挂起
  • final_suspend():定义协程结束时的挂起策略
  • unhandled_exception():异常处理机制
  • 至少一个return_value或return_void
典型实现示例
struct promise_type {
    handle_type get_return_object() { 
        return handle_type::from_promise(*this); 
    }
    std::suspend_always initial_suspend() { return {}; }
    std::suspend_always final_suspend() noexcept { return {}; }
    void unhandled_exception() { std::terminate(); }
    void return_void() {}
};
上述代码定义了一个基础promise_type,其中initial_suspend和final_suspend均挂起,可用于延迟执行或资源清理。

2.3 协程句柄与返回对象的构造时机分析

在协程执行模型中,协程句柄(Coroutine Handle)是控制协程生命周期的关键对象。其构造发生在协程函数被调用时,编译器生成的Promise对象初始化后立即创建。
构造流程解析
  • 调用协程函数时,首先分配Promise对象
  • Promise通过get_return_object()构造返回值
  • 随后创建协程句柄,绑定Promise与协程帧
task<int> compute() {
    co_return 42;
}
上述代码中,compute()调用触发task<int>的get_return_object(),返回未完成的task实例,此时句柄已关联运行上下文。
对象生命周期关系
阶段Promise状态句柄可用性
函数调用已构造可获取
首次暂停挂起有效
完成析构中失效

2.4 自定义返回类型与promise_type的绑定方式

在C++20协程中,自定义返回类型需通过`promise_type`进行绑定。编译器会查找返回类型的内部嵌套类`promise_type`,并据此生成协程帧的管理逻辑。
绑定机制解析
当协程函数返回自定义类型`Task`时,该类型必须内嵌`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() {}
    };
};
上述代码中,`get_return_object()`用于构造返回实例,`initial_suspend`控制协程启动时是否挂起。
关键成员函数作用
  • get_return_object:生成协程返回值
  • initial_suspend:决定协程开始是否立即执行
  • final_suspend:控制协程结束时的行为
  • return_void/return_value:处理无返回或有值返回情况

2.5 编译器如何生成协程状态机代码探秘

编译器在遇到协程函数时,会将其转换为一个状态机类,通过状态迁移控制执行流程。每个 `await` 点被标记为暂停点,对应状态机中的一个状态。
状态机结构解析
以 C# 为例,编译器生成的类包含:
  • MoveNext():驱动状态转移
  • StateMachineAttribute:标记协程状态机
  • 局部变量提升为字段
代码生成示例

// 原始协程
async Task DelayThenPrint()
{
    await Task.Delay(1000);
    Console.WriteLine("Done");
}
编译器将其重写为包含状态字段和 MoveNext 方法的状态机类型,await 表达式被拆解为任务注册与回调调度,实现非阻塞等待。

第三章:构建可复用的协程任务类型

3.1 设计一个支持co_await的task<>模板类

为了实现协程中可等待的 task 类型,必须定义符合 Awaitable 概念的类模板。核心是提供 await_ready、await_suspend 和 await_resume 三个方法。
关键接口设计
template<typename T>
class task {
public:
    struct promise_type;
    using handle_type = std::coroutine_handle<promise_type>;

    bool await_ready() const noexcept { return !handle || handle.done(); }
    void await_suspend(handle_type h) { /* 挂起逻辑 */ }
    T await_resume() { return handle.promise().result(); }
};
该代码定义了 task 的基本结构。其中 promise_type 负责管理协程状态,await_suspend 决定是否继续执行或挂起,await_resume 返回最终结果。
状态管理机制
  • 协程句柄(coroutine_handle)用于控制执行流程
  • promise_type 存储返回值与异常
  • 通过引用计数或事件循环调度生命周期

3.2 在promise_type中管理异常与最终完成回调

在协程的生命周期中,`promise_type` 扮演着控制执行结果与异常处理的核心角色。通过重写 `unhandled_exception()` 方法,可捕获协程内部未处理的异常并存储,供后续检查。
异常捕获机制
void unhandled_exception() {
    exception_ = std::current_exception();
}
当协程体抛出异常时,运行时自动调用此方法,将异常对象保存在成员变量 `exception_` 中,避免程序崩溃。
最终完成回调的实现
通过 `final_suspend()` 控制协程结束时的行为:
auto final_suspend() noexcept {
    struct awaiter {
        bool await_ready() { return false; }
        void await_resume() {}
        void await_suspend(std::coroutine_handle<>) {
            // 触发完成回调逻辑
        }
    };
    return awaiter{};
}
该挂起点允许在协程销毁前执行清理或通知操作,如唤醒等待线程或触发回调函数,确保资源安全释放与状态同步。

3.3 实现惰性执行与即时执行协程的行为区分

在现代异步编程中,协程的执行策略直接影响系统资源利用率和响应性能。根据调用时机的不同,协程可分为惰性执行与即时执行两种模式。
惰性执行协程
惰性执行的协程仅在被显式等待时才启动,适用于按需计算场景:

func lazyCoroutine() <-chan int {
    ch := make(chan int)
    go func() {
        defer close(ch)
        time.Sleep(1 * time.Second)
        ch <- 42
    }()
    return ch // 启动后不立即执行核心逻辑
}
该模式延迟资源消耗,适合高并发下减少调度压力。
即时执行协程
即时执行协程在创建时即开始运行,确保任务尽早处理:

func eagerCoroutine() {
    go func() {
        time.Sleep(500 * time.Millisecond)
        fmt.Println("Task completed")
    }() // 立即触发goroutine执行
}
特性惰性执行即时执行
启动时机首次await创建时
资源占用低高
响应延迟较高较低

第四章:高阶技巧与性能优化策略

4.1 自定义内存分配:重载operator new/delete for coroutine

在协程频繁创建与销毁的场景中,标准内存分配可能成为性能瓶颈。通过重载 `operator new` 和 `operator delete`,可为协程定制高效内存管理策略。
重载实现示例

void* operator new(std::size_t size) {
    return malloc(size ? size : 1);
}

void operator delete(void* ptr) noexcept {
    free(ptr);
}
上述代码拦截协程帧的内存请求,使用更轻量的分配器替代默认堆操作,减少系统调用开销。
性能优化优势
  • 降低内存分配延迟,提升协程启动速度
  • 支持对象池或区域分配(arena allocation)集成
  • 便于内存使用监控与调试追踪

4.2 避免堆分配:使用coroutine_handle::from_promise栈优化

在C++协程中,编译器通常会将promise对象和协程帧(coroutine frame)在堆上分配,带来不必要的内存开销。通过`coroutine_handle::from_promise`,可实现栈优化,避免动态分配。
核心机制
利用promise类型反向构造句柄,允许在已知promise生命周期可控时,将其置于栈上。关键在于自定义`get_return_object`方法:

struct stack_promise {
    std::coroutine_handle<> get_return_object() {
        return std::coroutine_handle<stack_promise>::from_promise(*this);
    }
    std::suspend_always initial_suspend() { return {}; }
    std::suspend_always final_suspend() noexcept { return {}; }
    void return_void() {}
    void unhandled_exception() {}
};
上述代码中,`from_promise`直接从栈上`*this`构建句柄,绕过堆分配。该技术适用于栈生命周期明确的场景,显著降低协程启动开销。

4.3 协程取消机制的设计与promise_type集成

在协程设计中,取消机制是保障资源安全和响应性的关键。通过在 `promise_type` 中集成取消状态,可实现协程体内外的协同控制。
取消标志的集成
在自定义 `promise_type` 中添加布尔字段标记取消状态:
struct promise_type {
    bool canceled = false;
    void cancel() { canceled = true; }
    auto yield_value(std::nullptr_t) {
        return std::suspend_always{};
    }
};
该字段由外部调用 `cancel()` 设置,协程内部可通过轮询判断是否应提前终止。
协作式取消检测
协程函数在长时间操作中应周期性检查取消状态:
  • 每次循环迭代时查询 `promise.canceled`
  • 若为真,则清理资源并主动返回
  • 确保不继续执行后续耗时逻辑
此方式实现了轻量级、协作式的取消协议,避免强制中断导致的状态不一致。

4.4 多线程环境下协程的调度与同步保障

在多线程环境中,协程的调度需兼顾线程安全与执行效率。运行时系统通常采用工作窃取(work-stealing)算法分配协程任务,确保各线程负载均衡。
调度机制
每个线程维护本地任务队列,协程优先在同一线程内切换,减少锁竞争。当本地队列为空时,线程会从其他线程队列尾部“窃取”任务。
同步保障
使用原子操作和无锁队列管理协程状态变更。以下为Golang中通过sync.Mutex保护共享数据的示例:

var mu sync.Mutex
var counter int

func increment() {
    mu.Lock()
    defer mu.Unlock()
    counter++ // 安全更新共享变量
}
该代码确保多个协程并发调用increment时,counter的修改具有原子性,避免数据竞争。

第五章:总结与现代C++异步编程展望

异步编程模型的演进趋势
现代C++标准持续推进异步编程能力的发展。从C++11引入的std::future,到C++20中协程(coroutines)和std::jthread的加入,异步任务管理变得更加高效和直观。
  • 基于回调的传统模式逐渐被结构化并发替代
  • 协程使异步代码具备同步书写风格,提升可读性
  • std::lazy<T>提案预示更灵活的延迟计算支持
实战案例:协程结合线程池优化I/O密集型服务
在高并发日志聚合系统中,采用自定义awaitable对象与静态线程池结合,显著降低上下文切换开销:
// 自定义任务类型,支持co_await
struct async_write_op {
    bool await_ready() { return false; }
    void await_suspend(std::coroutine_handle<> h) {
        thread_pool.post([h](){ h.resume(); }); // 写入完成后恢复协程
    }
    void await_resume() {}
};
未来技术整合方向
技术特性当前状态应用场景
C++23 std::sync_stream已支持多线程输出同步
Networking TS草案阶段原生异步网络通信
[主线程] → 启动协程任务 → [挂起] ↓ [线程池调度] → 执行I/O操作 → [完成通知] → [恢复执行]
C++20协程在实际项目中的应用 协程是一种可以暂停执行并在稍后恢复的函数。与普通函数不同,协程可以在执行过程中多次返回(yield),每次返回时保存当前状态,恢复时从上次暂停的地方继续执行。C++20协程为异步编程带来了革命性的改进,它允许开发者以同步的代码风格编写异步逻辑,大大提升了代码的可读性和可维护性。异步I/O操作:网络编程、文件操作等生成器模式:惰性求值、数据流处理状态机:复杂的状态转换逻辑任务调度:高效的异步任务管理内存开销:每个协程都需要分配内存生命周期管理:确保协程在适当的时候被销毁异常处理。 阅读详情

相关推荐

C++20四大之二:coroutines特性详解

协程与线程 1,有栈式协程与无栈式协程

扶风的博客 5551

揭秘C++20协程的promise_type:如何自定义协程行为

掌握C++20协程自定义行为的关键在于理解promise_type实现。本文解析其在异步任务、生成器中的应用,揭示如何通过重写get_return_object、yield_value等方法控制协程逻辑,提升性能与灵活性,值得收藏。

LogicShoal的博客 962

FPGA—DHT11数字温湿度传感器

1. DH1T11温湿度传感器与DS18B20温湿度传感器非常类似,都是严格按照时序要求写代码。建议可以比较学习。2. 显示温度与湿度部分的数据处理,采用 X10 进行在数码管上的移一位显示,配合了数码管小数部分的显示特点又区分了温度与湿度。3. 程序是按照一个接一个状态及顺序跳转的,建议使用状态机。说明:本人使用的是野火家Xilinx Spartan6系列开发板及配套教程,以上内容如有疑惑或错误欢迎评论区指出,或者移步B站观看野火家视频教程。

m0_72885897的博客 4779

【C++20协程深度解析】:从promise_type入手掌握协程核心机制

掌握C++20协程核心机制,从promise_type实现入手。本文深入解析协程的挂起、恢复与返回值处理,涵盖自定义promise_type的关键方法及在异步编程中的实际应用。理解协程底层原理,提升高并发程序设计能力,值得收藏。

AlgoPerch的博客 897

Creo报错代码-9?手把手教你重新生成许可证文件(基于Creo 10.0)

本文详细解析Creo报错代码-9的成因及解决方案,重点介绍如何重新生成许可证文件以应对网络环境变化导致的验证失败。通过分步指南和高级技巧,帮助用户有效管理多网络环境下的Creo许可证问题,提升工作效率。

weixin_30839881的博客 560

Crazyflie 2.1固件刷写与地址配置全攻略:从开箱到连接Crazyswarm

本文详细介绍了Crazyflie 2.1微型无人机的固件刷写、地址配置及与Crazyswarm系统的集成方法。从开箱检查到多机协同飞行,涵盖了硬件准备、固件刷写、无线电地址修改等关键步骤,帮助用户快速实现集群飞行控制。特别针对Crazyswarm系统集成提供了实用配置示例和调试技巧。

weixin_42530458的博客 405

深入promise_type内部:揭开C++20协程状态管理的秘密

掌握C++20协程状态管理的关键在于理解promise_type实现。本文解析其在协程生命周期中的作用,涵盖初始暂停、返回对象生成及异常处理机制,揭示高效异步编程的核心设计。深入原理,值得收藏。

IterStream的博客 650

手把手教你用Simulink搭建交流异步电机矢量控制模型(附完整仿真文件)

本文提供了一份详细的Simulink仿真指南,手把手教你从零开始搭建交流异步电机矢量控制模型。内容涵盖主电路搭建、坐标变换实现、双闭环PI调节器设计、转子磁链观测器调试等核心步骤,并附有完整的仿真文件,帮助读者跨越理论到实践的鸿沟,掌握高性能电机控制系统的建模与仿真技能。

pz890123的博客 665

C++20协程中promise_type的返回值究竟如何影响协程行为?

掌握C++20协程行为的关键在于理解promise_type的返回机制。本文解析其在协程挂起、恢复和最终返回中的作用,涵盖自定义promise_type的核心方法与适用场景,帮助开发者精准控制协程流程。深入浅出,值得收藏。

AlgoChat的博客 889

GitHub霸榜神器!NextChat领衔DeepSeek全栈开发范式

NextChat(原ChatGPT-Next-Web)是GitHub上斩获81.2K星标的现象级开源项目,定位为"轻量级AI助手终端",支持DeepSeek、Claude、GPT-4、Gemini等20+主流大模型。• 原生集成DeepSeek、GPT-4、Gemini Pro等模型API,同时兼容RWKV-Runner、LocalAI等自建模型框架,通过环境变量。• 客户端体积仅5MB(Windows安装包约6MB),采用PWA渐进式Web应用技术,首屏加载速度优化至100KB级,老旧设备亦可流畅运行。

实战AI智能体 894

python基础之语言发展历史

博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏。 目录一、前言二、发展历史1、Python是一种面向对象的解释型编程语言2、Python常被称为胶水语言3、Python由Guido开发4、Python连续多年入选编程语言TOP105、Python的发展历史三、总结 一、前言   由于Python语言的简洁性、易读性以及可扩展性,它在网络爬虫、数据分析、.

jiankang66的博客 3348

C++20协程中promise_type的5个关键接口,你真的理解了吗?

掌握C++20协程的promise_type实现,深入解析5个关键接口及其作用。涵盖operator new、get_return_object、initial_suspend等核心方法,揭示协程控制机制与应用场景。理解它们如何协作实现自定义行为,提升异步编程效率,值得收藏。

LearnPlex的博客 780

【2005】人工智能⭐

问题的解答来自于过去的经验而不是规则,这些经验是以案例方式存储的。但是当人们遇到一个新的问题的时候,一般先是回忆,从记忆中找到一个与新的问题相似的案例,然后把该案例的有关信息和知识复用到新问题的求解之中。1、若案例(case)不够充足,而有足够的规则(知识),试问如何构建一个包含有基于案例推理和基于规则推理的推理系统,以使推理效率提高而且总能求得问题的解。一般认为,CBR适合缺乏完备和健全的理论,但又可获取丰富经验的领域,而RBR则适合于对领域有充分的认识,能以完备和健全的形式表示领域理论的场合。

super_mochi1 280

【协程底层原理揭秘】:从promise_type返回看C++20协程状态管理

掌握C++20协程状态管理核心技巧,本文深入解析promise_type的返回机制,揭示协程底层原理。涵盖awaiter控制流、co_await挂起逻辑及自定义返回对象的应用场景,助你高效构建异步任务。理解promise_type如何决定协程行为,值得收藏。

VarIsle的博客 1036

链接文件及功能安全:基于Tasking的LSL链接文件知识点梳理及实际应用分析

本文旨在记录研究链接文件时所遇到的问题及个人理解,以便日后查阅。在探索过程中,我遇到了诸多问题,同时对链接文件有了初步的认识。通过记录这些问题与理解,我希望能够为后续的研究提供清晰的思路和有价值的参考。这不仅是对研究过程的总结,更是对未来学习和实践的有力支持。

梦想技术家 1103

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【C++20协程深度解析】:promise_type返回机制揭秘与高效编程技巧

掌握C++20协程核心机制,深入解析promise_type的返回控制原理。涵盖协程自定义返回对象、awaiter行为与状态管理,适用于异步编程与高性能场景。详解编译器如何通过promise_type定制协程行为,提升代码效率与可维护性,值得收藏。

LiteProceed的博客 707

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++20协程设计精要:promise_type返回机制背后的编译器魔法

掌握C++20协程设计关键,深入解析promise_type返回机制的编译器实现原理。涵盖协程句柄管理、内存分配优化及实际应用场景,揭示异步编程高效背后的秘密。理解C++20协程promise_type的返回逻辑,提升系统级编程能力,值得收藏。

DeepLens的博客 586

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

c++20 协程

C++20协程只是提供协程机制,而不是提供协程库。C++20的协程是无栈协程,无栈协程是一个可以挂起/恢复的特殊函数,是函数调用的泛化,且只能被线程调用,本身并不抢占内核调度。​ C++20 提供了三个新关键字(co_await、co_yield 和 co_return),如果一个函数中存在这三个关键字之一,那么它就是一个协程。也就是说只提高构建协程的一种机制,本身并不提供协程库​ 协程相关的三个关键字:co_await、co_yield与co_return。

weixin_57011178的博客 1256

你真的懂C++20协程的return_value和promise_type返回逻辑吗?

掌握C++20协程核心机制,深入解析promise_type的返回逻辑与return_value调用时机,揭示协程在异步编程中的实际应用。涵盖关键接口设计与状态管理优势,助你高效构建协程任务。你真的懂C++20协程promise_type的返回吗?值得收藏

PixelIsle的博客 835

【C++ 异步编程】C++ 20 的协程起手指南

C++20协程实践:从基础到异步任务处理 本文介绍了C++20协程的基本概念和实践应用。协程作为用户态轻量级线程,通过co_await和co_yield关键字实现控制权让出,解决了异步编程中的回调地狱问题。文章详细讲解了如何通过promise_type定义协程规则,并展示了Awaitable异步等待对象的实现。通过一个完整示例代码,演示了协程创建、异步任务处理和协程返回的全过程,帮助读者理解协程的执行流程和接口调用关系。最后提出了使用协程实现百万并发服务器的进阶目标。

weixin_40901147的博客 1051

promise_type到底有多重要?彻底搞懂C++20协程设计基石

掌握C++20协程设计核心,深入解析promise_type到底有多重要。通过C++20协程的 promise_type 实现,揭示协程自定义行为的关键机制,涵盖返回对象生成、异常处理与暂停逻辑,适用于异步编程与惰性求值场景。理解其作用原理,提升协程编程灵活性,值得收藏。

FuncTide的博客 577

C++20协程Promise Type深度解析:从原理到高性能异步库实现

协程是现代异步编程的核心概念,它通过挂起与恢复机制,允许开发者以同步风格编写非阻塞代码,从而提升程序的可读性与可维护性。其底层原理依赖于编译器生成的协程帧与Promise Type的交互契约,Promise Type作为协程的“控制中枢”,定义了协程的初始化、挂起、恢复、返回值传递及异常处理等行为。这一机制的技术价值在于提供了语言级的异步原语,使得开发者能够构建高性能、低延迟的并发系统,广泛应用于网络服务器、游戏引擎、数据处理等需要高吞吐量的场景。本文聚焦于C++20协程的Promise Type实现细节,

ciqiaofu0192的博客 318

【C++新特性】:谈谈C++20的协程(10000字讲清楚C++协程)

本文记录了我对C++20协程了理解,从各种方面讲解了C++20协程的定义的方式,以及手把手带大家学习如果自定义协程框架

jerryhe_com的博客 1243

C++20(协程)

先看看线程:线程是 CPU 调度的基本单位,属于内核,保存上下文需要切换到内核态,成本较高,线程是抢占式的,任何一个线程都可能会被随时切换,线程阻塞会一直等直到唤醒。协程:粒度比线程更细,协程属于用户态,上下文的保存在用户态完成,成本较低不需要状态转换,协程是协作式的,协程的挂起由另一个协程恢复,协程阻塞不会影响其他的协程,多个协程可以跑在一个线程上。

CD200309的博客 1032

C++20 协程

摘要:本文系统解析C++20协程的核心机制与实现原理,重点探讨协程与普通函数的本质差异、执行流程控制及底层实现细节。通过对比普通函数的栈式调用与协程的状态保持特性,揭示协程在异步编程中的独特优势。文章构建简单协程示例,详细追踪其生命周期(从initial_suspend到final_suspend),并通过改造可手动控制的协程版本(引入coroutine_handle与suspend_always)展示暂停/恢复机制。关键实现技术包括promise_type状态管理、awaitable对象转换逻辑、协程帧内

梦的灰色边沿... 1424
上一篇: Spring Security密码加密避坑指南:BCrypt强度选错=开门迎盗?
下一篇: 为什么你的thread_local变量初始化失败?一文看懂TLS机制底层原理
LiteCode
博客等级 码龄1年 146粉丝 2019原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值