6868
6969 </ head >
7070 < body >
71- < header data-kunai-mdinfo ="{"meta": {"header": ["execution"], "id-type": ["cpo"], "namespace": ["std::execution"], "cpp": ["cpp26"]}, "sources": [{"id": "160fcf1daa366e1a586a2f52e89673ed76b36f87", "source": "#include <execution>\nnamespace ex = std::execution;\n\nint main()\n{\n ex::counting_scope scope;\n ex::sender auto sndr =\n ex::just(42)\n | ex::associate(scope.get_token());\n\n std::this_thread::sync_wait(sndr);\n}\n"}], "page_id": ["reference", "execution", "execution", "associate"]} ">
71+ < header data-kunai-mdinfo ="{"meta": {"header": ["execution"], "id-type": ["cpo"], "namespace": ["std::execution"], "cpp": ["cpp26"]}, "sources": [{"id": "07c3b1623cbb97fb841cb8eb72aa4b49c5cdd48e", "source": "#include <execution>\n#include <print>\nnamespace ex = std::execution;\n\nint main()\n{\n // \u975e\u540c\u671f\u30b9\u30b3\u30fc\u30d7\u3092\u5b9a\u7fa9\n ex::counting_scope scope;\n\n // Sender\u3068\u975e\u540c\u671f\u30b9\u30b3\u30fc\u30d7\u3092\u95a2\u9023\u4ed8\u3051\n ex::sender auto sndr =\n ex::just(42)\n | ex::associate(scope.get_token());\n\n // \u30bf\u30b9\u30af\u958b\u59cb\u3068\u5b8c\u4e86\u5f85\u6a5f\n auto result = std::this_thread::sync_wait(std::move(sndr));\n std::println(\"value={}\", *result);\n\n // \u975e\u540c\u671f\u30b9\u30b3\u30fc\u30d7\u306e\u5408\u6d41\u5f85\u6a5f\n std::this_thread::sync_wait(scope.join());\n}\n"}], "page_id": ["reference", "execution", "execution", "associate"]} ">
7272 < nav class ="navbar navbar-default " role ="navigation ">
7373 < div class ="container-fluid ">
7474 < div class ="navbar-header ">
200200
201201 < p class ="text-right "> < small >
202202 最終更新日時(UTC):
203- < span itemprop ="datePublished " content ="2025-09-20T16:19:24 ">
204- 2025年09月20日 16時19分24秒
203+ < span itemprop ="datePublished " content ="2025-09-22T02:51:16 ">
204+ 2025年09月22日 02時51分16秒
205205 </ span >
206206 < br />
207207 < span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
@@ -235,6 +235,30 @@ <h2>概要</h2>
235235< p > < code > associate</ code > は、入力< a href ="sender.html "> Sender</ a > と非同期スコープとの関連付けを行うSenderアダプタである。
236236関連付けられた非同期スコープは、Senderが作成した非< a class ="cpprefjp-defined-word " data-desc ="マルチスレッド実行時にリソースの所有権に基づいて実行順序を制御する操作 "> 同期操作</ a > の生存期間を追跡できる。</ p >
237237< p > < code > associate</ code > は< a href ="sender_adaptor_closure.html "> パイプ可能Senderアダプタオブジェクト</ a > であり、パイプライン記法をサポートする。</ p >
238+ < p > < code > associate</ code > アルゴリズムが返す関連Sender(associate-sender)は、< a href ="scope_token.html "> 非同期スコープトークン</ a > を介した関連付け試行(< code > try_associate</ code > )の結果に応じてassociated/unassociatedいずれかの状態となり、入力Senderの動作を継承したうえで下記のように振る舞う。</ p >
239+ < ul >
240+ < li > associated状態< ul >
241+ < li > 関連Senderは入力Senderと同じ完了シグネチャを持ち、関連Senderとの< a href ="connect.html "> 接続(connect)</ a > や< a href ="start.html "> 開始(start)</ a > によって入力Senderとの接続や開始が行われる。</ li >
242+ < li > 関連Senderオブジェクトが破棄、もしくは接続後の< a href ="operation_state.html "> Operation State</ a > が破棄されたとき、関連付けを解除する。</ li >
243+ < li > < a href ="scope_token.html "> 非同期スコープトークン</ a > の< code > wrap</ code > メンバ関数で追加される処理を行う。</ li >
244+ </ ul >
245+ </ li >
246+ < li > unassociated状態 :< ul >
247+ < li > 入力Senderは破棄され、< a href ="connect.html "> 接続(connect)</ a > も< a href ="start.html "> 開始(start)</ a > もされない。</ li >
248+ < li > 関連Senderは< a href ="set_stopped.html "> set_stopped</ a > のみで完了する。</ li >
249+ </ ul >
250+ </ li >
251+ </ ul >
252+ < p > associated状態の関連Senderに対する< a href ="connect.html "> 接続(connect)</ a > 操作は、下記いずれかの結果となる。</ p >
253+ < ul >
254+ < li > 右辺値接続(rvalue connected)のとき、入力Senderとの関連付けは< a href ="operation_state.html "> Operation State</ a > へ移動する。</ li >
255+ < li > 左辺値接続(lvalue connected)のとき、< a href ="operation_state.html "> Operation State</ a > は非同期スコープとの新たな関連付けを必要とするため、< a href ="scope_token.html "> 非同期スコープトークン</ a > の< code > try_associate</ code > を呼び出して下記のいずれかの結果となる。< ul >
256+ < li > 新たな関連付けに成功する(< a class ="cpprefjp-defined-word " data-desc ="関数呼び出し式の評価結果となるオブジェクト・値 "> 戻り値</ a > が< code > true</ code > )。</ li >
257+ < li > 関連付けに失敗し(< a class ="cpprefjp-defined-word " data-desc ="関数呼び出し式の評価結果となるオブジェクト・値 "> 戻り値</ a > が< code > false</ code > )、< a href ="operation_state.html "> Operation State</ a > はunassociated状態の関連Senderから構築されたかのように振る舞う(< a href ="start.html "> 開始(start)</ a > 操作により即時で< a href ="set_stopped.html "> 停止完了</ a > する)。</ li >
258+ < li > < a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > 送出によって接続操作に失敗する。</ li >
259+ </ ul >
260+ </ li >
261+ </ ul >
238262< h2 > 効果</ h2 >
239263< p > 説明用の式< code > sndr</ code > と< code > token</ code > に対して、< code > decltype((sndr))</ code > が< code > < a href ="sender.html "> sender</ a > </ code > を満たさない、もしくは< code > < a href ="../../type_traits/remove_cvref.html "> remove_cvref_t</ a > <decltype((token))></ code > が< code > < a href ="scope_token.html "> scope_token</ a > </ code > を満たさないとき、呼び出し式< code > associate(sndr, token)</ code > は< a class ="cpprefjp-defined-word " data-desc ="プログラムが適格でないこと。コンパイルエラーなどになる " href ="../../../implementation-compliance.html#dfn-ill-formed "> 不適格</ a > となる。</ p >
240264< p > そうでなければ、呼び出し式< code > associate(sndr, token)</ code > は< code > sndr</ code > が1回だけ評価されることを除いて、下記と等価。</ p >
@@ -252,10 +276,10 @@ <h3>Senderアルゴリズムタグ <code>associate</code></h3>
252276 < span class ="k "> static</ span > < span class ="k "> constexpr</ span > < span class ="k "> auto</ span > < span class ="n "> start</ span > < span class ="o "> =</ span > < span class ="n "> < i > see below</ i > </ span > < span class ="p "> ;</ span > < span class ="c1 "> // exposition only</ span >
253277
254278 < span class ="k "> template</ span > < span class ="o "> <</ span > < span class ="k "> class</ span > < span class ="nc "> Sndr</ span > < span class ="p "> ,</ span > < span class ="n "> class</ span > < span class ="p "> ...</ span > < span class ="n "> Env</ span > < span class ="o "> ></ span >
255- < span class ="k "> static</ span > < span class ="n "> consteval</ span > < span class ="kt "> void</ span > < span class ="n "> check</ span > < span class ="o "> -</ span > < span class ="n "> types</ span > < span class ="p "> ()</ span > < span class ="p "> {</ span > < span class ="c1 "> // exposition only</ span >
256- < span class ="k "> using</ span > < span class ="n "> associate_data_t</ span > < span class ="o "> =</ span > < span class ="n "> < a href ="../../type_traits/remove_cvref.html "> remove_cvref_t</ a > </ span > < span class ="o "> <</ span > < span class ="n "> < a href ="data-type.html "> data-type</ a > </ span > < span class ="o "> <</ span > < span class ="n "> Sndr</ span > < span class ="o "> >></ span > < span class ="p "> ;</ span >
257- < span class ="k "> using</ span > < span class ="n "> child_type_t</ span > < span class ="o "> =</ span > < span class ="k "> typename</ span > < span class ="n "> associate_data_t</ span > < span class ="o "> ::</ span > < span class ="n "> wrap</ span > < span class ="o "> -</ span > < span class ="n "> sender</ span > < span class ="p "> ;</ span >
258- < span class ="p "> (</ span > < span class ="kt "> void</ span > < span class ="p "> )</ span > < span class ="n "> < a href ="get_completion_signatures.html "> get_completion_signatures</ a > </ span > < span class ="o "> <</ span > < span class ="n "> child_type_t</ span > < span class ="p "> ,</ span > < span class ="n "> < a href ="../forwarding_query.html "> FWD-ENV-T</ a > </ span > < span class ="p "> (</ span > < span class ="n "> Env</ span > < span class ="p "> )...</ span > < span class ="o "> ></ span > < span class ="p "> ();</ span >
279+ < span class ="k "> static</ span > < span class ="n "> consteval</ span > < span class ="kt "> void</ span > < span class ="n "> check</ span > < span class ="o "> -</ span > < span class ="n "> types</ span > < span class ="p "> ()</ span > < span class ="p "> {</ span > < span class ="c1 "> // exposition only</ span >
280+ < span class ="k "> using</ span > < span class ="n "> associate_data_t</ span > < span class ="o "> =</ span > < span class ="n "> < a href ="../../type_traits/remove_cvref.html "> remove_cvref_t</ a > </ span > < span class ="o "> <</ span > < span class ="n "> < a href ="data-type.html "> data-type</ a > </ span > < span class ="o "> <</ span > < span class ="n "> Sndr</ span > < span class ="o "> >></ span > < span class ="p "> ;</ span >
281+ < span class ="k "> using</ span > < span class ="n "> child_type_t</ span > < span class ="o "> =</ span > < span class ="k "> typename</ span > < span class ="n "> associate_data_t</ span > < span class ="o "> ::</ span > < span class ="n "> wrap</ span > < span class ="o "> -</ span > < span class ="n "> sender</ span > < span class ="p "> ;</ span >
282+ < span class ="p "> (</ span > < span class ="kt "> void</ span > < span class ="p "> )</ span > < span class ="n "> < a href ="get_completion_signatures.html "> get_completion_signatures</ a > </ span > < span class ="o "> <</ span > < span class ="n "> child_type_t</ span > < span class ="p "> ,</ span > < span class ="n "> < a href ="../forwarding_query.html "> FWD-ENV-T</ a > </ span > < span class ="p "> (</ span > < span class ="n "> Env</ span > < span class ="p "> )...</ span > < span class ="o "> ></ span > < span class ="p "> ();</ span >
259283 < span class ="p "> }</ span >
260284 < span class ="p "> };</ span >
261285< span class ="p "> }</ span >
@@ -341,7 +365,7 @@ <h2>説明専用エンティティ</h2>
341365 < span class ="o "> :</ span > < span class ="n "> sndr</ span > < span class ="p "> (</ span > < span class ="n "> t</ span > < span class ="p "> .</ span > < span class ="n "> wrap</ span > < span class ="p "> (</ span > < span class ="n "> < a href ="../../utility/forward.html "> std::forward</ a > </ span > < span class ="o "> <</ span > < span class ="n "> Sender</ span > < span class ="o "> ></ span > < span class ="p "> (</ span > < span class ="n "> s</ span > < span class ="p "> ))),</ span >
342366 < span class ="n "> token</ span > < span class ="p "> (</ span > < span class ="n "> t</ span > < span class ="p "> )</ span > < span class ="p "> {</ span >
343367 < span class ="k "> if</ span > < span class ="p "> (</ span > < span class ="o "> !</ span > < span class ="n "> token</ span > < span class ="p "> .</ span > < span class ="n "> try_associate</ span > < span class ="p "> ())</ span >
344- < span class ="n "> sndr</ span > < span class ="p "> .</ span > < span class ="n "> reset</ span > < span class ="p "> () ;</ span >
368+ < span class ="n "> sndr</ span > < span class ="p "> .</ span > < span class ="n "> < a href =" ../../optional/optional/ reset.html " > reset() </ a > </ span > < span class ="p "> ;</ span >
345369 < span class ="p "> }</ span >
346370
347371 < span class ="n "> associate</ span > < span class ="o "> -</ span > < span class ="n "> data</ span > < span class ="p "> (</ span > < span class ="k "> const</ span > < span class ="n "> associate</ span > < span class ="o "> -</ span > < span class ="n "> data</ span > < span class ="o "> &</ span > < span class ="n "> other</ span > < span class ="p "> )</ span >
@@ -408,22 +432,32 @@ <h2>カスタマイゼーションポイント</h2>
408432< p > Senderアルゴリズム構築時および< a href ="receiver.html "> Receiver</ a > 接続時に、関連付けられた実行ドメインに対して< code > < a href ="transform_sender.html "> execution::transform_sender</ a > </ code > 経由でSender変換が行われる。
409433< a href ="default_domain.html "> デフォルト実行ドメイン</ a > では無変換。</ p >
410434< h2 > 例</ h2 >
411- < p > < div class ="yata " id ="160fcf1daa366e1a586a2f52e89673ed76b36f87 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../execution.html "> <execution></ a > </ span > < span class ="cp "> </ span >
435+ < p > < div class ="yata " id ="07c3b1623cbb97fb841cb8eb72aa4b49c5cdd48e "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../execution.html "> <execution></ a > </ span > < span class ="cp "> </ span >
436+ < span class ="cp "> #include</ span > < span class ="cpf "> < a href ="../../print.html "> <print></ a > </ span > < span class ="cp "> </ span >
412437< span class ="k "> namespace</ span > < span class ="n "> ex</ span > < span class ="o "> =</ span > < span class ="n "> std</ span > < span class ="o "> ::</ span > < span class ="n "> execution</ span > < span class ="p "> ;</ span >
413438
414439< span class ="kt "> int</ span > < span class ="nf "> main</ span > < span class ="p "> ()</ span >
415440< span class ="p "> {</ span >
441+ < span class ="c1 "> // 非同期スコープを定義</ span >
416442 < span class ="n "> < a href ="counting_scope.html "> ex::counting_scope</ a > </ span > < span class ="n "> scope</ span > < span class ="p "> ;</ span >
443+
444+ < span class ="c1 "> // Senderと非同期スコープを関連付け</ span >
417445 < span class ="n "> < a href ="sender.html "> ex::sender</ a > </ span > < span class ="k "> auto</ span > < span class ="n "> sndr</ span > < span class ="o "> =</ span >
418446 < span class ="n "> < a href ="just.html "> ex::just</ a > </ span > < span class ="p "> (</ span > < span class ="mi "> 42</ span > < span class ="p "> )</ span >
419- < span class ="o "> |</ span > < span class ="n "> < span style ="color:#ff0000 "> ex::associate</ span > </ span > < span class ="p "> (</ span > < span class ="n "> scope</ span > < span class ="p "> .</ span > < span class ="n "> get_token</ span > < span class ="p "> ());</ span >
447+ < span class ="o "> |</ span > < span class ="n "> < span style ="color:#ff0000 "> ex::associate</ span > </ span > < span class ="p "> (</ span > < span class ="n "> scope</ span > < span class ="p "> .</ span > < span class ="n "> < a href ="counting_scope/get_token.html "> get_token()</ a > </ span > < span class ="p "> );</ span >
448+
449+ < span class ="c1 "> // タスク開始と完了待機</ span >
450+ < span class ="k "> auto</ span > < span class ="n "> result</ span > < span class ="o "> =</ span > < span class ="n "> < a href ="../this_thread/sync_wait.html "> std::this_thread::sync_wait</ a > </ span > < span class ="p "> (</ span > < span class ="n "> < a href ="../../utility/move.html "> std::move</ a > </ span > < span class ="p "> (</ span > < span class ="n "> sndr</ span > < span class ="p "> ));</ span >
451+ < span class ="n "> < a href ="../../print/println.html "> std::println</ a > </ span > < span class ="p "> (</ span > < span class ="s "> "value={}"</ span > < span class ="p "> ,</ span > < span class ="o "> *</ span > < span class ="n "> result</ span > < span class ="p "> );</ span >
420452
421- < span class ="n "> < a href ="../this_thread/sync_wait.html "> std::this_thread::sync_wait</ a > </ span > < span class ="p "> (</ span > < span class ="n "> sndr</ span > < span class ="p "> );</ span >
453+ < span class ="c1 "> // 非同期スコープの合流待機</ span >
454+ < span class ="n "> < a href ="../this_thread/sync_wait.html "> std::this_thread::sync_wait</ a > </ span > < span class ="p "> (</ span > < span class ="n "> scope</ span > < span class ="p "> .</ span > < span class ="n "> < a href ="counting_scope/join.html "> join()</ a > </ span > < span class ="p "> );</ span >
422455< span class ="p "> }</ span >
423456</ code > </ pre > </ div >
424457</ div > </ p >
425458< h3 > 出力</ h3 >
426- < p > < pre > < code > </ code > </ pre > </ p >
459+ < p > < pre > < code > value=42
460+ </ code > </ pre > </ p >
427461< h2 > バージョン</ h2 >
428462< h3 > 言語</ h3 >
429463< ul >
0 commit comments