Domain是C++26执行模型的策略载体,其核心解决两个问题:
执行策略泛化:将线程池、CUDA流等异构调度逻辑抽象为统一接口
策略组合安全:通过类型隔离避免不同执行域的策略污染
// Domain类型定义示例(P2300R10) struct cpu_domain { template <class Sender, class Env> static auto transform_sender(Sender&& snd, Env&& env); template <class Sender, class Receiver> static void apply_sender(Sender&& snd, Receiver&& rcvr); template <class Env> static auto transform_env(Env&& env); };
1. transform_sender:执行拓扑修改
作用:在Sender发射前插入定制逻辑(如日志、性能探针)
代码示例(添加耗时统计):
auto transformed = transform_sender(sender, env)
| then([](auto&&... args) { auto start = high_resolution_clock::now(); // ... 业务逻辑 return args...; });
2. apply_sender:执行策略实现
关键差异:定义任务的实际派发方式
// CPU线程池实现 void apply_sender(Sender snd, Receiver rcvr) { thread_pool.enqueue([=] { auto result = sync_wait(snd); set_value(rcvr, result); }); } // CUDA流实现 void apply_sender(Sender snd, Receiver rcvr) { cudaLaunchHostFunc(stream, [](void* data) { auto& [op, rcvr] = *static_cast<OpState*>(data); set_value(rcvr, op.result()); }, &op_state); }
3. transform_env:执行环境控制
核心作用:动态修改接收器的运行时上下文
auto new_env = transform_env(env) | with(get_delegation_scheduler, io_scheduler{}) | with(get_allocator, pinned_memory_allocator{});
get_delegation_scheduler:当任务未显式指定调度器时,提供默认派发策略
特性Executor模型Domain模型多态机制运行时虚函数编译期模板特化执行策略全局单一策略可组合嵌套策略硬件扩展需侵入式修改独立Domain实现性能开销类型擦除成本零额外开销
// 自定义CUDA Domain(参考NVIDIA/stdexec实现) struct cuda_domain { template <class Sender, class Env> static auto transform_sender(Sender&& snd, Env&& env) { // 自动插入CUDA流同步点 return on(cuda_stream_scheduler{}, std::forward<Sender>(snd)); } template <class Sender, class Receiver> static void apply_sender(Sender&& snd, Receiver&& rcvr) { cudaStream_t stream = get_stream(env); cudaLaunchHostFunc(stream, /* ... */); } template <class Env> static auto transform_env(Env&& env) { // 强制使用CUDA统一内存分配器 return make_env(env, with(get_allocator, cuda_allocator{})); } }; // 使用示例 auto gpu_task = schedule(cuda_scheduler) | transfer(cuda_domain{}) | then(/* GPU核函数 */);
避免跨Domain类型擦除:优先使用variant<domain1, domain2>替代通用Sender
环境属性缓存:通过transform_env预计算高频访问属性
Domain组合策略:将日志、监控等策略封装为独立Domain嵌套使用
Domain机制标志着C++执行模型从运行时抽象转向编译期策略组合,为异构计算提供了类型安全且高效的解决方案
随着C++26标准的推进,该模型将成为高性能计算、分布式系统等领域的核心基础设施