Skip to content

Commit 08365de

Browse files
committed
execution: schedule (#1384)
1 parent 7a43329 commit 08365de

File tree

3 files changed

+105
-8
lines changed

3 files changed

+105
-8
lines changed

reference/execution/execution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ namespace std::execution {
103103
| [`execution::just_error`](execution/just_error.md.nolink) | エラーを送信するSender (customization point object) | C++26 |
104104
| [`execution::just_stopped`](execution/just_stopped.md.nolink) | 停止を送信するSender (customization point object) | C++26 |
105105
| [`execution::read_env`](execution/read_env.md.nolink) | Receiver環境から構築されるSender (customization point object) | C++26 |
106-
| [`execution::schedule`](execution/schedule.md.nolink) | Scheduler上で実行されるSender (customization point object) | C++26 |
106+
| [`execution::schedule`](execution/schedule.md) | Scheduler上で実行されるSender (customization point object) | C++26 |
107107
| [`execution::schedule_result_t`](execution/schedule_result_t.md.nolink) | `schedule`結果型を取得 (alias template) | C++26 |
108108
109109
### Senderアダプタ
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# schedule
2+
* execution[meta header]
3+
* cpo[meta id-type]
4+
* std::execution[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std::execution {
9+
struct schedule_t { unspecified };
10+
inline constexpr schedule_t schedule{};
11+
}
12+
```
13+
* unspecified[italic]
14+
15+
## 概要
16+
`schedule`は、[Scheduler](scheduler.md)から[スケジュールSender](sender.md)を取得するSenderファクトリである。
17+
18+
スケジュールSenderより生成される[非同期操作](operation_state.md)を開始すると、Schedulerに関連付けられた実行リソース上で空の[値完了関数](set_value.md)を呼び出す。
19+
20+
21+
## 効果
22+
呼び出し式`schedule(sch)`は式`sch.schedule()`と等価であり、式の型は[`sender`](sender.md)を満たすこと。
23+
24+
式[`get_completion_scheduler`](get_completion_scheduler.md.nolink)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(sch.schedule())) == sch`が不適格もしくは`false`となる場合、呼び出し式`schedule(sch)`の動作は未定義となる。
25+
26+
27+
## カスタマイゼーションポイント
28+
[Scheduler](scheduler.md)`sch`に対して、式`sch.schedule()`が呼び出される。
29+
30+
31+
## 例
32+
```cpp example
33+
#include <print>
34+
#include <thread>
35+
#include <execution>
36+
namespace ex = std::execution;
37+
38+
int main()
39+
{
40+
ex::run_loop loop;
41+
std::jthread worker{[&]{
42+
std::println("start worker#{}", std::this_thread::get_id());
43+
loop.run();
44+
}};
45+
46+
ex::scheduler auto sch = loop.get_scheduler();
47+
ex::sender auto sndr =
48+
ex::schedule(sch)
49+
| ex::then([]{
50+
std::println("on worker#{}", std::this_thread::get_id());
51+
return 42;
52+
});
53+
54+
std::println("main#{}", std::this_thread::get_id());
55+
56+
auto [val] = std::this_thread::sync_wait(std::move(sndr)).value();
57+
std::println("val={}", val);
58+
59+
loop.finish();
60+
}
61+
```
62+
* ex::schedule[color ff0000]
63+
* ex::scheduler[link scheduler.md]
64+
* ex::sender[link sender.md]
65+
* ex::then[link then.md.nolink]
66+
* ex::run_loop[link run_loop.md.nolink]
67+
* get_scheduler()[link run_loop/get_scheduler.md.nolink]
68+
* run()[link run_loop/run.md.nolink]
69+
* finish()[link run_loop/finish.md.nolink]
70+
* std::this_thread::get_id()[link /reference/thread/this_thread/get_id.md]
71+
72+
### 出力例
73+
```
74+
main#134276695947072
75+
start worker#134276691527232
76+
on worker#134276691527232
77+
val=42
78+
```
79+
80+
81+
## バージョン
82+
### 言語
83+
- C++26
84+
85+
### 処理系
86+
- [Clang](/implementation.md#clang): ??
87+
- [GCC](/implementation.md#gcc): ??
88+
- [ICC](/implementation.md#icc): ??
89+
- [Visual C++](/implementation.md#visual_cpp): ??
90+
91+
92+
## 関連項目
93+
- [`execution::scheduler`](scheduler.md)
94+
95+
96+
## 参照
97+
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)

reference/execution/execution/scheduler.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace std::execution {
2525
* derived_from[link /reference/concepts/derived_from.md]
2626
* sender[link sender.md]
2727
* queryable[link ../queryable.md]
28-
* schedule[link schedule.md.nolink]
28+
* schedule[link schedule.md]
2929
* get_completion_scheduler[link get_completion_scheduler.md.nolink]
3030
* set_value_t[link set_value.md]
3131
* get_env[link get_env.md]
@@ -40,7 +40,7 @@ namespace std::execution {
4040
- `scheduler_t`をメンバ型`Sch::scheduler_concept`として定義する
4141
- [クエリ可能オブジェクト](../queryable.md)である
4242
- `Sch`型の値`sch`に対して下記を満たすこと
43-
- [`execution::schedule`](schedule.md.nolink)`(sch)`が[Sender](sender.md)を返す
43+
- [`execution::schedule`](schedule.md)`(sch)`が[Sender](sender.md)を返す
4444
- 上記Senderの[値完了関数](set_value.md)の[完了Scheduler](get_completion_scheduler.md.nolink)が`Sch`に等しいこと
4545
- コピー可能かつ同値比較可能
4646
@@ -69,15 +69,15 @@ namespace std::execution {
6969
`Sch``scheduler`の型、型`Env`[`sender_in`](sender_in.md)`<schedule_result_t<Sch>, Env>`を満たす実行環境の型としたとき、`sender-in-of<schedule_result_t<Sch>, Env>`のモデルとなること。
7070

7171
[`copyable`](/reference/concepts/copyable.md)`<remove_cvref_t<Sch>>`および[`equality_comparable`](/reference/concepts/equality_comparable.md)`<remove_cvref_t<Sch>>`により要求される操作は、例外で終了してはならない。
72-
これらの操作やScheduler型の[`schedule`](schedule.md.nolink)関数は、異なるスレッドから同時に操作を呼び出す可能性がある場合でも、データ競合を引き起こしてはならない。
72+
これらの操作やScheduler型の[`schedule`](schedule.md)関数は、異なるスレッドから同時に操作を呼び出す可能性がある場合でも、データ競合を引き起こしてはならない。
7373

7474
あるScheduler型`Sch`の2つの値`sch1`と`sch2`に対して、`sch1`と`sch2`が同じ実行リソースを共有する場合に限って、`sch1 == sch2`は`true`となる。
7575

76-
あるScheduler`sch`に対して、式[`get_completion_scheduler`](get_completion_scheduler.md.nolink)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md.nolink)`(sch)))`が`sch`と等しいこと。
76+
あるScheduler`sch`に対して、式[`get_completion_scheduler`](get_completion_scheduler.md.nolink)`<`[`set_value_t`](set_value.md)`>(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md)`(sch)))`が`sch`と等しいこと。
7777

78-
あるScheduler`sch`に対して式[`get_domain`](get_domain.md.nolink)`(sch)`が適格であるとき、式`get_domain(`[`get_env`](get_env.md)`(schedule(sch)))`も適格であり、かつ同じ型を持つ。
78+
あるScheduler`sch`に対して式[`get_domain`](get_domain.md.nolink)`(sch)`が適格であるとき、式`get_domain(`[`get_env`](get_env.md)`(`[`schedule`](schedule.md)`(sch)))`も適格であり、かつ同じ型を持つ。
7979

80-
Scheduler型のデストラクタは、`schedule`が返すSenderオブジェクトに接続されたReceiverの完了を待機してブロックしてはならない。
80+
Scheduler型のデストラクタは、[`schedule`](schedule.md)が返すSenderオブジェクトに接続されたReceiverの完了を待機してブロックしてはならない。
8181

8282

8383
## 例
@@ -112,7 +112,7 @@ int main()
112112

113113

114114
## 関連項目
115-
- [`execution::schedule`](schedule.md.nolink)
115+
- [`execution::schedule`](schedule.md)
116116

117117

118118
## 参照

0 commit comments

Comments
 (0)