- execution[meta header]
- cpo[meta id-type]
- std::this_thread[meta namespace]
- cpp26[meta cpp]
namespace std::this_thread {
struct sync_wait_t { unspecified };
inline constexpr sync_wait_t sync_wait{};
}- unspecified[italic]
sync_waitは、入力Senderが完了するまで現在のスレッドをブロックし、非同期操作の結果を取得するSenderコンシューマである。
sync_waitは入力Senderが値完了シグネチャを1個だけ持つことを要求する。
値完了シグネチャが複数存在する場合はsync_wait_with_variantアルゴリズムを利用する。
入力Senderの値完了シグネチャがset_value_t(Ts...)のとき、sync_waitの結果型はoptional<tuple<Ts...>>となる。
説明用のsndrをdecltype((sndr))がSndr型となる式とする。
呼び出し式this_thread::sync_wait(sndr)はsndrが1回だけ評価されることを除いて、下記と等価。
apply_sender(get-domain-early(sndr), sync_wait, sndr)- apply_sender[link ../execution/apply_sender.md]
- get-domain-early[link ../execution/get-domain-early.md]
sender_in<Sndr,sync-wait-env> == trueであること。- 型
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>>;
}- execution::sender_in[link ../execution/sender_in.md]
- sync-wait-env[link sync-wait-env.md]
- execution::value_types_of_t[link ../execution/value_types_of_t.md]
- optional[link /reference/optional/optional.md]
- decayed-tuple[link ../execution/decayed-tuple.md]
- type_identity_t[link /reference/type_traits/type_identity.md]
説明用のsndrをdecltype((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);- sync-wait-state[link sync-wait-receiver.md]
- connect[link ../execution/connect.md]
- sync-wait-receiver[link sync-wait-receiver.md]
- start[link ../execution/start.md]
- loop.run()[link ../execution/run_loop/run.md]
- rethrow_exception[link /reference/exception/rethrow_exception.md]
- std::move[link /reference/utility/move.md]
入力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);
}- std::this_thread::sync_wait[color ff0000]
- ex::sender[link ../execution/sender.md]
- ex::just[link ../execution/just.md]
- value()[link /reference/optional/optional/value.md]
result=(100, X)
- C++26
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??