Skip to content

Commit 88bcec6

Browse files
committed
execution: run_loop全メンバ (#1384)
1 parent 665471d commit 88bcec6

10 files changed

Lines changed: 303 additions & 34 deletions

File tree

reference/execution/execution/completion-domain.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ constexpr auto completion-domain(const Sndr& sndr) noexcept;
1111
* default_domain[link default_domain.md]
1212
1313
## 概要
14-
[Sender型](sender.md)`sndr`の[完了Scheduler](get_completion_scheduler.md)から[実行ドメイン](default_domain.md)を取得する説明専用の関数テンプレート。
14+
[Sender](sender.md)`sndr`の[完了Scheduler](get_completion_scheduler.md)から[実行ドメイン](default_domain.md)を取得する説明専用の関数テンプレート。
1515
1616
1717
## 効果
1818
説明用の型`COMPL-DOMAIN(T)`を式[`get_domain`](get_domain.md)`(`[`get_completion_scheduler`](get_completion_scheduler.md)`<T>(`[`get_env`](get_env.md)`(sndr)))`の型とする。
1919
2020
- 型`COMPL-DOMAIN(`[`set_value_t`](set_value.md)`)`、`COMPL-DOMAIN(`[`set_error_t`](set_error.md)`)`、`COMPL-DOMAIN(`[`set_stopped_t`](set_stopped.md)`)`の全てが不適格の場合、`completion-domain<Default>`は`Default`型のデフォルト構築されたprvalueとなる。
21-
- そうではなく、上記のうち不適格となる型を除いた型が[共通型](/reference/type_traits/common_type.md)を共有するならば、`completion-domain<Default>`はその共有型のデフォルト構築されたprvalueとなる
21+
- そうではなく、上記のうち不適格となる型を除いた型が[共通型](/reference/type_traits/common_type.md)を共有するならば、`completion-domain<Default>`はその共通型のデフォルト構築されたprvalueとなる
2222
- そうでなければ、`completion-domain<Default>`は不適格となる。
2323
2424

reference/execution/execution/run_loop.md

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ namespace std::execition {
1414
`run_loop`は、実行制御ライブラリの作業を[スケジュール](schedule.md)可能な実行リソース(execution resource)である。
1515
1616
内部的にスレッドセーフなFIFO (first-in first-out) 作業キューを保持する。
17-
[`run`メンバ関数](run_loop/run.md.nolink)はキューから作業を取り出し、同関数を呼び出したスレッド上のループで実行する。
17+
[`run`メンバ関数](run_loop/run.md)はキューから作業を取り出し、同関数を呼び出したスレッド上のループで実行する。
1818
1919
`run_loop`インスタンスの動作説明のため、下記の説明用メンバ変数を持つ。
2020
21-
- `count` : FIFOキューが保持する作業の個数
22-
- `state` : 開始(starting)実行中(running)/完了中(finishing)/完了済み(finished) いずれかのインスタンス状態
21+
- `count` : キュー上に保持している作業の個数
22+
- `state` : [開始(starting)](run_loop/op_constructor.md)/[実行中(running)](run_loop/run.md)/[終了中(finishing)](run_loop/finish.md)/[終了済み(finished)](run_loop/run.md) いずれかの状態
2323
2424
2525
## メンバ関数
@@ -29,54 +29,59 @@ namespace std::execition {
2929
| [`(constructor)`](run_loop/op_constructor.md) | コンストラクタ | C++26 |
3030
| [`(destructor)`](run_loop/op_destructor.md) | デストラクタ | C++26 |
3131
| [`get_scheduler`](run_loop/get_scheduler.md) | Scheduler取得 | C++26 |
32-
| [`run`](run_loop/run.md.nolink) | ループ実行を開始 | C++26 |
33-
| [`finish`](run_loop/finish.md.nolink) | ループ実行を終了 | C++26 |
32+
| [`run`](run_loop/run.md) | キュー上の作業を逐次実行 | C++26 |
33+
| [`finish`](run_loop/finish.md) | 状態を終了中に変更 | C++26 |
3434
3535
## 説明専用のメンバ型
3636
3737
| 名前 | 説明 | 対応バージョン |
3838
|------|------|-------|
39-
| [`run-loop-scheduler`](run_loop/run-loop-scheduler.md) | 説明専用クラス | C++26 |
40-
| [`run-loop-sender`](run_loop/run-loop-sender.md) | 説明専用クラス | C++26 |
41-
| [`run-loop-opstate`](run_loop/run-loop-opstate.md.nolink) | 説明専用クラス | C++26 |
39+
| [`run-loop-scheduler`](run_loop/run-loop-scheduler.md) | 動作説明用の[Scheduler型](scheduler.md) | C++26 |
40+
| [`run-loop-sender`](run_loop/run-loop-sender.md) | 動作説明用の[Sender型](sender.md) | C++26 |
41+
| [`run-loop-opstate-base`](run_loop/run-loop-opstate.md) | 動作説明用の基底クラス | C++26 |
42+
| [`run-loop-opstate`](run_loop/run-loop-opstate.md) | 動作説明用のクラステンプレート | C++26 |
4243
4344
4445
## 例
4546
```cpp example
47+
#include <print>
4648
#include <execution>
4749
namespace ex = std::execution;
4850
4951
struct MyReceiver {
5052
using receiver_concept = ex::receiver_t;
5153
5254
void set_value() noexcept
53-
{ std::println("value"); }
55+
{ std::println("success"); }
5456
void set_error(std::exception_ptr) noexcept
55-
{ std::println("error"); }
57+
{ std::println("failure"); }
5658
void set_stopped() noexcept
57-
{ std::println("stopped"); }
59+
{ std::println("cancellation"); }
5860
};
5961
6062
6163
int main()
6264
{
63-
// run_loopのスケジュールSenderを取得
6465
ex::run_loop loop;
65-
ex::scheduler auto sch = loop.get_scheduler();
66-
// state:開始(starting)
66+
// count=0, state=開始(starting)
6767
68+
// run_loopのスケジュールSenderとReceiverを接続
69+
ex::scheduler auto sch = loop.get_scheduler();
6870
ex::sender auto sndr = ex::schedule(sch);
6971
ex::receiver auto rcvr = MyReceiver{};
70-
ex::operation_state auto op = ex::connect(sndr, rcvr);
71-
// キューに作業を1つ追加
72+
auto op = ex::connect(sndr, rcvr);
73+
74+
// run_loopキューに作業を1つ追加
7275
ex::start(op);
76+
// count=1, state=開始(starting)
7377
74-
// stateを完了中(finished)へ遷移
78+
// run_loop状態を終了中(finished)へ変更
7579
loop.finish();
80+
// count=1, state=終了中(finished)
7681
77-
// キュー上の作業を全て処理
82+
// run_loopキュー上の作業を逐次実行
7883
loop.run();
79-
// state:完了済み(finished)
84+
// count=0, state=終了済み(finished)
8085
}
8186
```
8287
* ex::run_loop[color ff0000]
@@ -85,16 +90,15 @@ int main()
8590
* ex::schedule[link schedule.md]
8691
* ex::receiver[link receiver.md]
8792
* ex::receiver_t[link receiver.md]
88-
* ex::operation_state[link operation_state.md]
8993
* ex::connect[link connect.md]
9094
* ex::start[link start.md]
9195
* get_scheduler()[link run_loop/get_scheduler.md]
92-
* finish()[link run_loop/finish.md.nolink]
93-
* run()[link run_loop/run.md.nolink]
96+
* finish()[link run_loop/finish.md]
97+
* run()[link run_loop/run.md]
9498

9599
### 出力
96100
```
97-
value
101+
success
98102
```
99103

100104

@@ -110,7 +114,7 @@ value
110114

111115

112116
## 関連項目
113-
- [`execution::schedule`](schedule.md)
117+
- [`execution::scheduler`](scheduler.md)
114118

115119

116120
## 参照
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# finish
2+
* execution[meta header]
3+
* std::execution[meta namespace]
4+
* run_loop[meta class]
5+
* function[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
void finish();
10+
```
11+
12+
## 概要
13+
`run_loop`の状態を終了中(finishing)へ変更する。
14+
15+
16+
## 事前条件
17+
説明専用メンバ`state`[開始(starting)](op_constructor.md)もしくは[実行中(running)](run.md)であること。
18+
19+
20+
## 効果
21+
説明専用メンバ`state`を終了中(finishing)に変更する。
22+
23+
24+
## 同期操作
25+
メンバ関数`finish`および説明専用メンバ関数[`pop-front`, `push-back`](run.md)は不可分(atomically)に実行される。
26+
27+
`finish`は、`nullptr`を返す[`pop-front`操作](run.md)に対して同期する。
28+
29+
30+
##
31+
```cpp example
32+
#include <execution>
33+
namespace ex = std::execution;
34+
35+
int main()
36+
{
37+
ex::run_loop loop;
38+
loop.finish();
39+
}
40+
```
41+
* finish()[color ff0000]
42+
* ex::run_loop[link ../run_loop.md]
43+
44+
### 出力
45+
```
46+
```
47+
48+
## バージョン
49+
### 言語
50+
- C++26
51+
52+
53+
### 処理系
54+
- [Clang](/implementation.md#clang): ??
55+
- [GCC](/implementation.md#gcc): ??
56+
- [ICC](/implementation.md#icc): ??
57+
- [Visual C++](/implementation.md#visual_cpp): ??
58+
59+
60+
## 関連項目
61+
- [`run`](run.md)
62+
63+
64+
## 参照
65+
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)

reference/execution/execution/run_loop/op_destructor.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@
1010
```
1111

1212
## 概要
13-
`run_loopオブジェクトを破棄する
13+
`run_loop`オブジェクトを破棄する
1414

1515

1616
## 効果
17-
`count`が非`0`かつ`state`が実行中(running)のとき、[`terminate`](/reference/exception/terminate.md)を呼び出す。
18-
それ以外のときは、効果を持たない。
17+
`count`が非`0`かつ`state`[実行中(running)](run.md)のとき、[`terminate`](/reference/exception/terminate.md)を呼び出してプログラムを異常終了させる。
18+
それ以外のとき、効果を持たない。
19+
20+
21+
## 同期操作
22+
[`run`](run.md)とデストラクタ以外のメンバ関数同時呼び出しは、データ競合を引き起こさない。
1923

2024

2125
## バージョン
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# run-loop-opstate
2+
* execution[meta header]
3+
* std::execution[meta namespace]
4+
* run_loop[meta class]
5+
* class template[meta id-type]
6+
* cpp26[meta cpp]
7+
8+
```cpp
9+
template<class Rcvr>
10+
struct run-loop-opstate;
11+
```
12+
13+
## 概要
14+
`run-loop-opstate`は、[`run_loop`](../run_loop.md)動作説明で利用される説明専用のクラスである。
15+
16+
17+
## クラス仕様
18+
説明専用の基底クラス`run-loop-opstate-base`を下記の通り定義する。
19+
`run-loop-opstate<Rcvr>`は、`run-loop-opstate-base`から曖昧さなくprivate継承したクラスである。
20+
21+
```cpp
22+
struct run-loop-opstate-base { // exposition only
23+
virtual void execute() = 0; // exposition only
24+
run_loop* loop; // exposition only
25+
run-loop-opstate-base* next; // exposition only
26+
};
27+
```
28+
* run_loop[link ../run_loop.md]
29+
30+
説明用の`o``run-loop-opstate<Rcvr>`型の非const左辺値、`REC(o)``o`を返す[接続(connect)](../connect.md)呼び出しへ渡した式`rcvr`で初期化された`Rcvr`型の非const左辺値参照とする。
31+
32+
- `REC(o)`が参照するオブジェクトは、`o`が参照するオブジェクトの生存期間(lifetime)で有効である。
33+
-`run-loop-opstate<Rcvr>``run-loop-opstate-base::execute()`をオーバーライドし、式`o.execute()`は下記と等価 :
34+
35+
```cpp
36+
if (get_stop_token(REC(o)).stop_requested()) {
37+
set_stopped(std::move(REC(o)));
38+
} else {
39+
set_value(std::move(REC(o)));
40+
}
41+
```
42+
* get_stop_token[link ../../get_stop_token.md]
43+
* set_stopped[link ../set_stopped.md]
44+
* set_value[link ../set_value.md]
45+
* std::move[link /reference/utility/move.md]
46+
47+
-`start(o)`は下記と等価 :
48+
49+
```cpp
50+
try {
51+
o.loop->push-back(addressof(o));
52+
} catch(...) {
53+
set_error(std::move(REC(o)), current_exception());
54+
}
55+
```
56+
* push-back[link run.md]
57+
* set_error[link ../set_value.md]
58+
* addressof[link /reference/memory/addressof.md]
59+
* std::move[link /reference/utility/move.md]
60+
* current_exception()[link /reference/exception/current_exception.md]
61+
62+
63+
## バージョン
64+
### 言語
65+
- C++26
66+
67+
68+
## 関連項目
69+
- [`run`](run.md)
70+
- [`execution::start`](../start.md)
71+
72+
73+
## 参照
74+
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)

reference/execution/execution/run_loop/run-loop-scheduler.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@ class run-loop-scheduler; // exposition only
1212
## 概要
1313
`run-loop-scheduler`は、[`get_scheduler`メンバ関数](get_scheduler.md)の戻り値型として利用される説明専用のクラスである。
1414
15+
16+
## クラス仕様
1517
- `run-loop-scheduler`型は[`scheduler`](../scheduler.md)のモデルとなる未規定の型。
1618
- `run-loop-scheduler`インスタンスは、同インスタンスを取得した[`run_loop`](../run_loop.md)インスタンスの生存期間(lifetime)終了まで有効。
17-
- 2個の`run-loop-scheduler`インスタンスは、[`run_loop`](../run_loop.md)インスタンスから取得された場合に限って等しい。
19+
- 2個の`run-loop-scheduler`インスタンスは、同一[`run_loop`](../run_loop.md)インスタンスから取得された場合に限って等しい。
1820
- 説明用の式`sch`の型が`run-loop-scheduler`であるとき、式[`schedule`](../schedule.md)`(sch)`は型[`run-loop-sender`](run-loop-sender.md)となり、式`sch`が潜在的に例外送出しない(not potentially-throwing)ならばそれに従う。
1921
2022

reference/execution/execution/run_loop/run-loop-sender.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ class run-loop-sender; // exposition only
1212
## 概要
1313
`run-loop-sender`は、[`get_scheduler`メンバ関数](get_scheduler.md)が返す[`run-loop-scheduler`](run-loop-scheduler.md)動作仕様の説明で利用される説明専用のクラスである。
1414
15+
## クラス仕様
1516
- `run-loop-sender`型は[`sender`](../sender.md)のモデルである。
1617
- 任意の型`Env`に対して、[`completion_signatures_of_t`](../completion_signatures_of_t.md)`<run-loop-sender, Env>`は[`completion_signatures`](../completion_signatures.md)`<`[`set_value_t`](../set_value.md)`(),` [`set_error_t`](../set_error.md)`(`[`exception_ptr`](/reference/exception/exception_ptr.md)`),` [`set_stopped_t`](../set_stopped.md)`()>`
1718
- `run-loop-sender`インスタンスは、関連付けられた[`run_loop`](../run_loop.md)インスタンスの生存期間(lifetime)終了まで有効。
1819
- 説明用の式`sndr`の型を`run-loop-sender`、`CS`が上記[`completion_signatures`](../completion_signatures.md)の特殊化であるとき[`receiver_of`](../receiver_of.md)`<decltype((rcvr)), CS>`が`true`となる式`rcvr`としたとき、
19-
- 式[`connect`](../connect.md)`(sndr, rcvr)`の型は[`run-loop-opstate`](run-loop-opstate.md.nolink)`<`[`decay_t`](/reference/type_traits/decay.md)`<decltype((rcvr))>>`であり、潜在的な例外送出(potentially-throwing)は式`(void(sndr), auto(rcvr))`に従う。
20+
- 式[`connect`](../connect.md)`(sndr, rcvr)`の型は[`run-loop-opstate`](run-loop-opstate.md)`<`[`decay_t`](/reference/type_traits/decay.md)`<decltype((rcvr))>>`であり、潜在的な例外送出(potentially-throwing)は式`(void(sndr), auto(rcvr))`に従う。
2021
- 完了タグ`C`を[`set_value_t`](../set_value.md)または[`set_stopped_t`](../set_stopped.md)としたとき、式[`get_completion_scheduler`](../get_completion_scheduler.md)`<C>(`[`get_env`](../get_env.md)`(sndr))`の潜在的な例外送出は`sndr`に従う。式の型は[`run-loop-scheduler`](run-loop-scheduler.md)となり、そのインスタンスは同一`sndr`から取得された場合に等しくなる。
2122
2223

0 commit comments

Comments
 (0)