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

履歴 編集

customization point object
<execution>

std::this_thread::sync_wait(C++26)

namespace std::this_thread {
  struct sync_wait_t { unspecified };
  inline constexpr sync_wait_t sync_wait{};
}

概要

sync_waitは、入力Senderが完了するまで現在のスレッドをブロックし、非同期操作の結果を取得するSenderコンシューマである。

sync_waitは入力Senderが値完了シグネチャを1個だけ持つことを要求する。 値完了シグネチャが複数存在する場合はsync_wait_with_variantアルゴリズムを利用する。

入力Senderの値完了シグネチャがset_value_t(Ts...)のとき、sync_waitの結果型はoptional<tuple<Ts...>>となる。

効果

説明用のsndrdecltype((sndr))Sndr型となる式とする。

sender_in<Sndr, sync-wait-env> == falseのとき、呼び出し式this_thread::sync_wait(sndr)不適格となる。

そうでなければ、呼び出し式this_thread::sync_wait(sndr)sndrが1回だけ評価されることを除いて、下記と等価。

apply_sender(get-domain-early(sndr), sync_wait, sndr)

  • sync-wait-result-type<Sndr>適格であること。
  • 上記のapply_sender式をeとしたとき、same_as<decltype(e), sync-wait-result-type<Sndr>> == trueであること。

結果型

sync_waitの結果型となる、説明専用のエイリアステンプレートsync-wait-result-typeを下記の通り定義する。

namespace std::this_thread {
  template<execution::sender_in<sync-wait-env> Sndr>
  using sync-wait-result-type =
    optional<execution::value_types_of_t<Sndr, sync-wait-env,
             decayed-tuple, type_identity_t>>;
}

Senderアルゴリズムタグ sync_wait

説明用のsndrdecltype((sndr))Sndr型となる式とする。

sender_to<Sndr, sync-wait-receiver<Sndr>> == falseのとき、式sync_wait.apply_sender(sndr)不適格となる。

そうでなければ、式sync_wait.apply_sender(sndr)は下記と等価。

sync-wait-state<Sndr> state;
auto op = connect(sndr, sync-wait-receiver<Sndr>{&state});
start(op);

state.loop.run();
if (state.error) {
  rethrow_exception(std::move(state.error));
}
return std::move(state.result);

カスタマイゼーションポイント

入力Sendersndr関連付けられた実行ドメインdomに対して、 execution::apply_sender経由でdom.apply_sender(sync_wait, sndr)が呼ばれる。

デフォルト実行ドメインでは、sync_wait.apply_sender(sndr)が呼ばれる。

下記を満たさない場合、呼び出し式this_thread::sync_wait(sndr)動作は未定義となる。

  • 指定したSenderが完了するまで、前方進行保証委任(forward progress guarantee delegation)による現在のスレッドをブロックすること。
  • 指定したSenderの非同期操作の結果が返る場合

#include <print>
#include <execution>
namespace ex = std::execution;

int main()
{
  // 値(100, 'X')を送信するSender
  ex::sender auto sndr = ex::just(100, 'X');
  // メインスレッド上で完了待機
  auto result = std::this_thread::sync_wait(sndr);
  // 結果型optional<tuple<int,char>>から値を取り出す
  auto [n, c] = result.value();
  std::println("result=({}, {})", n, c);
}

出力

result=(100, X)

バージョン

言語

  • C++26

処理系

関連項目

参照