- stop_token[meta header]
- concept[meta id-type]
- std[meta namespace]
- cpp26[meta cpp]
mplate<class Source>
concept stoppable-source =
requires (Source& src, const Source csrc) {
{ csrc.get_token() } -> stoppable_token;
{ csrc.stop_possible() } noexcept -> same_as<bool>;
{ csrc.stop_requested() } noexcept -> same_as<bool>;
{ src.request_stop() } -> same_as<bool>;
};
- stoppable_token[link stoppable_token.md]
stoppable-source
は、型Source
が次のインタフェースを持つことを表す説明専用のコンセプトである。
- 停止トークンを取得する(
get_token
) - 停止可能か否かを問い合わせる(
stop_possible
) - 停止要求が行われたか否かを問い合わせる(
stop_requested
) - 停止要求を行う(
request_stop
)
stoppable-source
のモデルとなる型は、最初に停止要求が行われた時に呼び出される停止コールバックの登録リストを管理する。
stoppable-source
のモデルである型のオブジェクトは次を満たすこと。
- 最大で1つの関連付けられた停止状態を持つ。
- オブジェクト
s
が停止状態を持たない(disengaged)とき、s.stop_possible()
とs.stop_requested()
はfalse
となる。 - オブジェクト
t
が停止状態を持たないとき、t.get_token()
は停止状態を持たない停止トークンを返す。そうでなければ、t
の停止状態に関連付けられた停止トークンを返す。 request_stop
,stop_requested
,stop_possible
メンバ関数の呼び出しはデータ競合を引き起こさない。true
を返すrequest_stop
呼び出しは、stopppable_token
またはstoppable-source
オブジェクトにおけるtrue
を返すstop_requested
呼び出しに対して同期する。- コールバックの登録は、そのコールバック呼び出しに対して同期する。
stoppable-source
が停止状態を持たないとき、request_stop
は効果をもたずfalse
を返す。そうでなければ、関連づけられた停止状態に対して次の停止要求操作(stop request operation)を実行する。- 停止要求操作は停止状態が停止要求を受信済みか否かを判定し、未受信であれば停止要求を行う。この判定はアトミックに行われる。
- 停止要求が行われたとき、停止状態に登録されているコールバックが同期的に実行される。コールバック呼び出しが例外で終了した場合、
terminate
が呼び出される。
- 停止要求が行われたとき
request_stop
はtrue
を返す。そうでなければfalse
を返す。 request_stop
呼び出し後は、stop_possible
がfalse
を返すか、stop_requested
がtrue
を返す。
- 停止状態に登録されたコールバック呼び出しの実行順序に制約は課されない。
- C++26
- Clang: ??
- GCC: ??
- ICC: ??
- Visual C++: ??