namespace std::execution {
template<scheduler Sch>
struct change_coroutine_scheduler {
using type = remove_cvref_t<Sch>;
type scheduler;
};
template<scheduler Sch>
change_coroutine_scheduler(Sch) -> change_coroutine_scheduler<Sch>;
}
概要
タスクexecution::taskを戻り値型とするコルーチンにおいて、co_await式でタスクScheduler変更を表現するタグ型。
co_await change_coroutine_scheduler{sch}
タスクコルーチンにおいて後続の非同期処理を実行するタスクSchedulerをschに変更する。同co_await式は変更前のタスクSchedulerを返す。
詳細仕様はtask::promise_type::await_transformを参照のこと。
例
#include <execution>
#include <print>
namespace ex = std::execution;
ex::task<> work()
{
// sch0 := 本コルーチン(Sender)を開始したScheduler
// shc1 := co_await式で利用する別Scheduler(並列Schedulerを利用)
std::println("run on Scheduler#0");
ex::scheduler auto sch1 = ex::get_parallel_scheduler();
co_await (ex::schedule(sch1) | ex::then([]{
// Scheduler sch1上で非同期処理を実行
std::println("run on Scheduler#1");
}));
// コルーチンタスクのデフォルト動作:
// co_await式はScheduler Affinityを維持するため
// コルーチン後続処理は元Scheduler上で実行される
std::println("run on Scheduler#0");
// 本コルーチンのタスクSchedulerをinline_schedulerへ変更
co_await ex::change_coroutine_scheduler{ex::inline_scheduler{}};
co_await (ex::schedule(sch) | ex::then([]{
// Scheduler sch1上で非同期処理を実行
std::println("run on Scheduler#1");
}));
// inline_scheduler動作:
// co_await式のScheduler Affinity維持を抑止するため
// 同式中で変更したScheduler上でコルーチン後続処理が実行される
std::println("run on Scheduler#1");
}
int main()
{
std::this_thread::sync_wait(work());
}
出力
バージョン
言語
- C++26
処理系
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??