Skip to content

Commit 7c7167b

Browse files
committed
stop_token: inplace_stop_source (#1384)
- stoppable-source 説明専用concept - stop_token 概要をP2300R10に追従
1 parent aa69763 commit 7c7167b

File tree

5 files changed

+180
-22
lines changed

5 files changed

+180
-22
lines changed

reference/stop_token.md

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
`<stop_token>`ヘッダは、マルチスレッド処理や非同期処理おける停止要求の状態 `停止状態` を扱うクラスを定義する。
66

77
- [`stop_token`](stop_token/stop_token.md), [`stop_source`](stop_token/stop_source.md), [`stop_callback`](stop_token/stop_callback.md)は停止状態を共有所有する。最後に破棄されたオブジェクトが停止状態を自動的に解放する。
8-
- [`inplace_stop_source`](stop_token/inplace_stop_source.md.nolink)は停止状態をメンバとして直接所有する。[`inplace_stop_token`](stop_token/inplace_stop_token.md.nolink)[`inplace_stop_callback`](stop_token/inplace_stop_callback.md.nolink)は停止状態の所有には関与しない。
8+
- [`inplace_stop_source`](stop_token/inplace_stop_source.md)は停止状態をメンバとして直接所有する。[`inplace_stop_token`](stop_token/inplace_stop_token.md.nolink)[`inplace_stop_callback`](stop_token/inplace_stop_callback.md.nolink)は停止状態の所有には関与しない。
9+
910

1011
## コンセプト
1112
| 名前 | 説明 | 対応バージョン |
@@ -16,14 +17,14 @@
1617
## 停止トークン
1718
| 名前 | 説明 | 対応バージョン |
1819
|------|------|-------|
19-
| [`stop_token`](stop_token/stop_token.md) | 停止トークン (class) | C++20 |
20-
| [`stop_source`](stop_token/stop_source.md) | 停止要求を発生させるクラス (class) | C++20 |
21-
| [`stop_callback`](stop_token/stop_callback.md)| 停止要求に応じて呼び出されるコールバック (class template) | C++20 |
22-
| [`nostopstate`](stop_token/nostopstate.md) | 停止状態を扱わない[`stop_source`](stop_token/stop_source.md)を構築するためのタグ (class) | C++20 |
20+
| [`stop_token`](stop_token/stop_token.md) | [`stop_source`](stop_token/stop_source.md)の停止トークン (class) | C++20 |
21+
| [`stop_source`](stop_token/stop_source.md) | 停止状態を共有所有する停止要求インタフェース (class) | C++20 |
22+
| [`stop_callback`](stop_token/stop_callback.md)| [`stop_source`](stop_token/stop_source.md)停止要求に応じて呼び出されるコールバック (class template) | C++20 |
23+
| [`nostopstate`](stop_token/nostopstate.md) | 停止状態を扱わない[`stop_source`](stop_token/stop_source.md)構築用タグ (class) | C++20 |
2324
| [`never_stop_token`](stop_token/never_stop_token.md) | 停止不可能な停止トークン (class) | C++26 |
24-
| [`inplace_stop_token`](stop_token/inplace_stop_token.md.nolink) | インプレース停止トークン (class) | C++26 |
25-
| [`inplace_stop_source`](stop_token/inplace_stop_source.md.nolink) | インプレース停止要求を発生させるクラス (class) | C++26 |
26-
| [`inplace_stop_callback`](stop_token/inplace_stop_callback.md.nolink) | インプレース停止要求に応じて呼び出されるコールバック (class template) | C++26 |
25+
| [`inplace_stop_token`](stop_token/inplace_stop_token.md.nolink) | [`inplace_stop_source`](stop_token/inplace_stop_source.md)の停止トークン (class) | C++26 |
26+
| [`inplace_stop_source`](stop_token/inplace_stop_source.md) | 停止状態を直接所有する停止要求インタフェース (class) | C++26 |
27+
| [`inplace_stop_callback`](stop_token/inplace_stop_callback.md.nolink) | [`inplace_stop_source`](stop_token/inplace_stop_source.md)停止要求に応じて呼び出されるコールバック (class template) | C++26 |
2728
| [`stop_callback_for_t`](stop_token/stop_callback_for_t.md) | 対応するコールバック型を取得 (alias template) | C++26 |
2829

2930

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# inplace_stop_source
2+
* stop_token[meta header]
3+
* class[meta id-type]
4+
* std[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
namespace std {
9+
class inplace_stop_source;
10+
}
11+
```
12+
13+
## 概要
14+
クラス`inplace_stop_source`は、停止状態をメンバとして直接所有し、停止要求を作成するためのインターフェースを提供する。
15+
16+
`inplace_stop_source`は[`stoppable-source`](stoppable-source.md)のモデルである。
17+
18+
19+
## メンバ関数
20+
21+
| 名前 | 説明 | 対応バージョン |
22+
|------|------|-------|
23+
| [`(constructor)`](inplace_stop_source/op_constructor.md.nolink) | コンストラクタ | C++26 |
24+
| `(destructor)` | デストラクタ | C++26 |
25+
| `operator=` | 代入演算子 | C++26 |
26+
| [`get_token`](inplace_stop_source/get_token.md.nolink) | 自身の停止状態を参照する[`inplace_stop_token`](inplace_stop_token.md.nolink)を返す | C++26 |
27+
| [`stop_requested`](inplace_stop_source/stop_requested.md.nolink) | 停止要求を作成したかどうかを取得する | C++26 |
28+
| [`request_stop`](inplace_stop_source/request_stop.md.nolink) | 停止要求を作成する | C++26 |
29+
30+
## 静的メンバ関数
31+
32+
| 名前 | 説明 | 対応バージョン |
33+
|------|------|-------|
34+
| [`stop_possible`](inplace_stop_source/stop_possible.md.nolink) | 停止要求を作成可能どうかを取得する | C++26 |
35+
36+
37+
## 例
38+
```cpp example
39+
#include <cassert>
40+
#include <stop_token>
41+
42+
int main()
43+
{
44+
std::inplace_stop_source ss;
45+
std::inplace_stop_token st = ss.get_token();
46+
47+
bool invoked = false;
48+
std::inplace_stop_callback cb {st, [&] { invoked = true; }};
49+
50+
assert(st.stop_requested() == false);
51+
assert(invoked == false);
52+
53+
ss.request_stop();
54+
55+
assert(st.stop_requested() == true);
56+
assert(invoked == true);
57+
}
58+
```
59+
* std::inplace_stop_source[color ff0000]
60+
* std::inplace_stop_token[link inplace_stop_token.md.nolink]
61+
* std::inplace_stop_callback[link inplace_stop_callback.md.nolink]
62+
* stop_requested()[link inplace_stop_token/stop_requested.md.nolink]
63+
* request_stop()[link inplace_stop_source/request_stop.md.nolink]
64+
* get_token()[link inplace_stop_source/get_token.md.nolink]
65+
66+
### 出力
67+
```
68+
```
69+
70+
71+
## バージョン
72+
### 言語
73+
- C++26
74+
75+
### 処理系
76+
- [Clang](/implementation.md#clang): ??
77+
- [GCC](/implementation.md#gcc): ??
78+
- [ICC](/implementation.md#icc): ??
79+
- [Visual C++](/implementation.md#visual_cpp): ??
80+
81+
82+
## 関連項目
83+
- [`inplace_stop_token`](inplace_stop_token.md.nolink)
84+
- [`inplace_stop_callback`](inplace_stop_callback.md.nolink)
85+
86+
87+
## 参照
88+
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)

reference/stop_token/stop_source.md

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,33 +11,30 @@ namespace std {
1111
```
1212
1313
## 概要
14-
クラス`stop_source`は、停止要求を作成するためのインターフェースを提供する。
15-
また、自身と停止状態を共有する[`stop_token`](stop_token.md)クラスのオブジェクトを構築できる。
14+
クラス`stop_source`は、停止状態を[`stop_token`](stop_token.md)と共有所有し、停止要求を作成するためのインターフェースを提供する。
1615
17-
## 備考
18-
ある`stop_source`に対して作成した停止要求は、同じ停止状態を共有するほかの`stop_source`や`stop_token`から可視になる。
16+
`stop_source`は[`stoppable-source`](stoppable-source.md)、[`copyable`](/reference/concepts/copyable.md)、[`equality_comparable`](/reference/concepts/equality_comparable.md)、[`swappable`](/reference/concepts/swappable.md)のモデルである。
1917
20-
一度停止要求を作成すると、それをあとで取り下げることはできない。また、それ以降に作成した停止要求は効果を持たない。
2118
2219
## メンバ関数
2320
2421
| 名前 | 説明 | 対応バージョン |
25-
|-------------------------------------------------|--------------------------------------------------------------------|-------|
22+
|------|------|-------|
2623
| [`(constructor)`](stop_source/op_constructor.md) | コンストラクタ | C++20 |
2724
| [`(destructor)`](stop_source/op_destructor.md) | デストラクタ | C++20 |
2825
| [`operator=`](stop_source/op_assign.md) | 代入演算子 | C++20 |
2926
| [`swap`](stop_source/swap.md) | 別の`stop_source`と交換する | C++20 |
30-
| [`get_token`](stop_source/get_token.md) | 自身と停止状態を共有する[`stop_token`](stop_token.md)を構築して返す | C++20 |
27+
| [`get_token`](stop_source/get_token.md) | 自身と停止状態を共有する[`stop_token`](stop_token.md)を返す | C++20 |
3128
| [`stop_possible`](stop_source/stop_possible.md) | 停止要求を作成可能どうかを取得する | C++20 |
3229
| [`stop_requested`](stop_source/stop_requested.md)| 停止要求を作成したかどうかを取得する | C++20 |
3330
| [`request_stop`](stop_source/request_stop.md) | 停止要求を作成する | C++20 |
3431
3532
## 非メンバ関数
3633
| 名前 | 説明 | 対応バージョン |
37-
|---------------------------------|---------------------------------------|-------|
38-
| [`operator==`](stop_source/op_equal.md) | 等値演算子 | C++20 |
39-
| [`operator!=`](stop_source/op_not_equal.md) | 非等値演算子 | C++20 |
40-
| [`swap`](stop_source/swap_free.md) | 2つの`stop_source`オブジェクトを入れ替える | C++11 |
34+
|------|------|-------|
35+
| [`operator==`](stop_source/op_equal.md) | 等値演算子 | C++20 |
36+
| [`operator!=`](stop_source/op_not_equal.md) | 非等値演算子 | C++20 |
37+
| [`swap`](stop_source/swap_free.md) | 2つの`stop_source`オブジェクトを入れ替える | C++20 |
4138
4239
4340
## 例
@@ -73,14 +70,23 @@ int main()
7370
```
7471
```
7572

73+
7674
## バージョン
7775
### 言語
7876
- C++20
7977

80-
8178
### 処理系
8279
- [Clang](/implementation.md#clang): ??
8380
- [GCC](/implementation.md#gcc): ??
8481
- [ICC](/implementation.md#icc): ??
8582
- [Visual C++](/implementation.md#visual_cpp): ??
8683

84+
85+
## 関連項目
86+
- [`stop_token`](stop_token.md)
87+
- [`stop_callback`](stop_callback.md)
88+
89+
90+
## 参照
91+
- [P0660R10 Stop token and joining thread](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0660r10.pdf)
92+
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# stoppable-source
2+
* stop_token[meta header]
3+
* concept[meta id-type]
4+
* std[meta namespace]
5+
* cpp26[meta cpp]
6+
7+
```cpp
8+
mplate<class Source>
9+
concept stoppable-source =
10+
requires (Source& src, const Source csrc) {
11+
{ csrc.get_token() } -> stoppable_token;
12+
{ csrc.stop_possible() } noexcept -> same_as<bool>;
13+
{ csrc.stop_requested() } noexcept -> same_as<bool>;
14+
{ src.request_stop() } -> same_as<bool>;
15+
};
16+
```
17+
* stoppable_token[link stoppable_token.md]
18+
19+
## 概要
20+
`stoppable-source`は、型`Source`が次のインタフェースを持つことを表す説明専用のコンセプトである。
21+
22+
- [停止トークン](stoppable_token.md)を取得する(`get_token`)
23+
- 停止可能か否かを問い合わせる(`stop_possible`)
24+
- 停止要求が行われたか否かを問い合わせる(`stop_requested`)
25+
- 停止要求を行う(`request_stop`)
26+
27+
`stoppable-source`のモデルとなる型は、最初に停止要求が行われた時に呼び出される停止コールバックの登録リストを管理する。
28+
29+
30+
## モデル
31+
`stoppable-source`のモデルである型のオブジェクトは次を満たすこと。
32+
33+
- 最大で1つの関連付けられた停止状態を持つ。
34+
- オブジェクト`s`が停止状態を持たない(disengaged)とき、`s.stop_possible()`と`s.stop_requested()`は`false`となる。
35+
- オブジェクト`t`が停止状態を持たないとき、`t.get_token()`は停止状態を持たない[停止トークン](stoppable_token.md)を返す。そうでなければ、`t`の停止状態に関連付けられた停止トークンを返す。
36+
- `request_stop`, `stop_requested`, `stop_possible`メンバ関数の呼び出しはデータ競合を引き起こさない。
37+
- `true`を返す`request_stop`呼び出しは、`stopppable_token`または`stoppable-source`オブジェクトにおける`true`を返す`stop_requested`呼び出しに対して同期する。
38+
- コールバックの登録は、そのコールバック呼び出しに対して同期する。
39+
- `stoppable-source`が停止状態を持たないとき、`request_stop`は効果をもたず`false`を返す。そうでなければ、関連づけられた停止状態に対して停止要求操作を実行する。
40+
- 停止要求操作は停止状態が停止要求を受信済みか否かを判定し、未受信であれば停止要求を行う。この判定はアトミックに行われる。
41+
- 停止要求が行われたとき、停止状態に登録されているコールバックが同期的に実行される。コールバック呼び出しが例外で終了した場合、[`terminate`](/reference/exception/terminate.md)が呼び出される。
42+
- 停止要求が行われたとき`request_stop`は`true`を返す。そうでなければ`false`を返す。
43+
- `request_stop`呼び出し後は、`stop_possible`が`false`を返すか、`stop_requested`が`true`を返す。
44+
45+
46+
## 備考
47+
- 停止状態に登録されたコールバック呼び出しの実行順序に制約は課されない。
48+
49+
50+
## バージョン
51+
### 言語
52+
- C++26
53+
54+
### 処理系
55+
- [Clang](/implementation.md#clang): ??
56+
- [GCC](/implementation.md#gcc): ??
57+
- [ICC](/implementation.md#icc): ??
58+
- [Visual C++](/implementation.md#visual_cpp): ??
59+
60+
61+
## 参照
62+
- [P2300R10 `std::execution`](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p2300r10.html)

reference/stop_token/stoppable_token.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,15 @@ concept stoppable_token =
4646
4747
## モデル
4848
49-
説明用の変数`t`, `u`を、同一の停止状態を参照する別々な`Token`型ブジェクトとする
49+
説明用の変数`t`, `u`を、同一の停止状態を参照する別々な`Token`型オブジェクトとする
5050
型`Token`が以下を満たす場合に限って、型`Token`は`stoppable_token`のモデルである。
5151
5252
- `SP`を`t.stop_possible()`が`false`となる評価としたとき、`SP`より後に発生する`u.stop_possible()`や`u.stop_requested()`の評価は`false`であること。
5353
- `SR`を`t.stop_requested()`が`true`となる評価としたとき、`SR`より後に発生する`u.stop_possible()`や`u.stop_requested()`の評価は`true`であること。
5454
- `stoppable-callback-for<CallbackFn, Token, Initialize>`を満たす任意の型`CallbackFn`および型`Initialize`が、`stoppable-callback-for<CallbackFn, Token, Initializer>`のモデルであること。
5555
- `t`が停止状態を持たない(disengaged)とき、`t.stop_possible()`や`t.stop_requested()`の評価が`false`であること。
56-
- `t`と`u`が同一の停止状態を参照するか共に停止状態を持たない(disengaged)とき`t == u`が`true`であり、それ以外のときは`false`であること。
56+
- `t`と`u`が同一の停止状態を参照するか共に停止状態を持たないとき`t == u`が`true`であり、それ以外のときは`false`であること。
57+
- `request_stop`, `stop_requested`, `stop_possible`メンバ関数の呼び出しはデータ競合を引き起こさない。
5758
5859
5960
ここで、説明専用コンセプト`stoppable-callback-for`を以下のように定義する。

0 commit comments

Comments
 (0)