最終更新日時(UTC):
が更新

履歴 編集

class template
<execution>

std::execution::change_coroutine_scheduler(C++26)

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}

タスクコルーチンにおいて後続の非同期処理を実行するタスクSchedulerschに変更する。同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

処理系

関連項目

参照