0

0

c++26的std::execution的Sender/Receiver模型相比协程有何优势? (统一异步)

穿越時空

穿越時空

发布时间:2026-01-10 13:31:02

|

631人浏览过

|

来源于php中文网

原创

std::execution Sender/Receiver 是比协程更底层的异步原语,不依赖栈切换与隐式挂起,提供编译期可组合、类型安全、无栈无分配、显式错误传递的标准化异步抽象,支持跨生态互操作。

c++26的std::execution的sender/receiver模型相比协程有何优势? (统一异步)

std::execution Sender/Receiver 模型不是协程的替代品,而是更底层的异步原语

它不依赖切换、不隐式挂起、不引入运行时调度开销,本质是编译期可组合的回调抽象。协程(co_await)在 C++20 中是语法糖,其底层仍需依赖类似 Sender/Receiver 的机制来对接执行器(executor)和完成通知——C++26 的 std::execution 正是要标准化这个“底层”。你写 co_await,最终可能被编译成对 connect + start 的调用;而直接用 Sender/Receiver,则跳过协程帧分配和 ABI 约束,更适合零拷贝、硬实时或嵌入式场景。

组合性与类型安全远超协程链式 await

协程中连续 co_await 多个异步操作,实际形成的是线性控制流,难以表达并行、选择、重试等模式,且每个 awaitable 类型不统一,容易出现 no matching operator co_await 或模板推导失败。Sender/Receiver 则通过标准算法(如 thenlet_valueontransferwhen_all)提供可组合的、SFINAE 友好的管道式 DSL:

auto s = just(42)
       | then([](int x) { return x * 2; })
       | transfer(some_thread_pool)
       | let_value([](int y) { return just(y + 1); });

所有操作都在编译期检查签名兼容性(比如 then 的函数必须接收前一个 Sender 输出的值类型),错误信息指向具体连接点,而非模糊的 “awaitable concept not satisfied”。

无栈、无动态内存、可静态调度

默认情况下,Sender/Receiver 不强制分配协程帧,也不要求堆上分配状态对象。一个 just(3.14) Sender 可以是纯栈对象;connect 返回的 operation_state 也可 placement-new 在预分配缓冲区中。这使它能用于中断上下文、裸金属或内存受限环境。而协程默认生成带栈保存/恢复逻辑的帧,即使启用了 [[nodiscard]]promise_type::get_return_object_on_allocation_failure,也无法完全规避动态分配风险。

Sider
Sider

多功能AI浏览器助手,帮助用户进行聊天、写作、阅读、翻译等

下载

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

  • senderreceiver 都是无状态或显式管理状态的类模板,不隐含生命周期绑定
  • 调度策略(如 schedule_afterschedule_on)是独立的 Sender,可自由组合,不耦合到 awaitable 实现中
  • 没有隐式异常传播路径:错误通过 set_error 显式传递,避免协程中未捕获异常导致 std::terminate

与现有生态的互操作不是靠适配,而是收敛为统一基元

协程要接入第三方异步库(如 libuv、Boost.ASIO、CUDA stream),得为每个库单独写 awaitable 包装器;而 Sender/Receiver 提供标准接口:connectstartset_valueset_done。只要库实现这些定制点,就天然兼容 std::execution 算法——ASIO 已在 experimental 分支提供 as_sender,CUDA 也在推进 cuda::sender。协程做不到这点:你无法让 co_await cudaStreamSynchronize 直接参与 when_all,除非先把它封装成 Sender。

真正难的不是写一个 Sender,而是写出符合 sender concept 的、支持 transfer 跨执行域、支持 let_value 嵌套、且不泄漏资源的实现——概念约束严,但一旦满足,复用性和可推理性就远高于手写协程状态机。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1010

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

59

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

357

2025.12.29

堆和栈的区别
堆和栈的区别

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

384

2023.07.18

堆和栈区别
堆和栈区别

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

568

2023.08.10

堆和栈的区别
堆和栈的区别

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

384

2023.07.18

堆和栈区别
堆和栈区别

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

568

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

396

2023.08.14

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

25

2026.01.09

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外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号