std::execution::scheduler
定义在头文件 <execution> 中 |
||
template< class Sch > concept scheduler = |
(1) | (自 C++26) |
辅助标签类型 |
||
struct scheduler_t {}; |
(2) | (自 C++26) |
scheduler
概念由作为调度器的类型建模,即轻量级处理程序,用于处理与 C++ 执行库配合使用的线程池等执行资源。
[edit] 语义要求
给定类型为 Sch
的调度器和类型为 Env
的执行环境,使得 sender_in<schedule_result_t<Sch>, Env> 满足,那么 /*sender-in-of*/<schedule_result_t<Sch>, Env> 被建模。
调度器的复制构造函数、析构函数、相等比较或交换成员函数必须是非抛出函数。
所有这些成员函数以及调度器类型的 schedule
函数必须是线程安全的。
两个调度器相等,仅当它们代表相同的执行资源时。
对于给定的调度器 sch
,表达式 get_completion_scheduler<set_value_t>(get_env(schedule(sch))) 与 sch
相等。
对于给定的调度器 sch
,如果表达式 get_domain(sch) 形成良好,那么表达式 get_domain(get_env(schedule(sch))) 也形成良好,并且具有相同的类型。
调度器的析构函数不应阻塞挂起的完成,这些完成连接到从 schedule 返回的发送器对象(底层资源可能提供单独的 API 来等待已提交函数对象的完成)。
[edit] 示例
用于 std::execution::run_loop 的简单包装器,该包装器在一个专用的线程上不断轮询 run_loop 的队列。使用草案参考实现演示:https://godbolt.org/z/146fY4Y91
#include <execution> #include <iostream> #include <thread> class single_thread_context { std::execution::run_loop loop_{}; std::jthread thread_; public: single_thread_context() : thread_([this] { loop_.run(); }) {} single_thread_context(single_thread_context&&) = delete; ~single_thread_context() { loop_.finish(); } std::execution::scheduler auto get_scheduler() noexcept { return loop_.get_scheduler(); } }; int main() { single_thread_context ctx; std::execution::sender auto snd = std::execution::schedule(ctx.get_scheduler()) | std::execution::then([] { std::cout << "Hello world! Have an int.\n"; return 015; }) | std::execution::then([](int arg) { return arg + 42; }); auto [i] = std::this_thread::sync_wait(snd).value(); std::cout << "Back in the main thread, result is " << i << '\n'; }
输出
Hello world! Have an int. Back in the main thread, result is 55
[edit] 另请参阅
(C++26) |
在给定的调度器上准备一个任务图以供执行 (自定义点对象) |