Skip to content

Latest commit

 

History

History
62 lines (48 loc) · 3.32 KB

stoppable-source.md

File metadata and controls

62 lines (48 loc) · 3.32 KB

stoppable-source

  • 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_stoptrueを返す。そうでなければfalseを返す。
  • request_stop呼び出し後は、stop_possiblefalseを返すか、stop_requestedtrueを返す。

備考

  • 停止状態に登録されたコールバック呼び出しの実行順序に制約は課されない。

バージョン

言語

  • C++26

処理系

参照