33.3 ストップトークン (Stop Tokens) (thread.stoptoken)

編集

33.3.1 イントロダクション (thread.stoptoken.intro)

編集
  1. 概要
    §33.3は、操作の停止を非同期でリクエストするためのコンポーネントについて説明しています。通常、結果が不要になった場合に操作を停止するために使用されます。このようなリクエストは「ストップリクエスト」と呼ばれます。
  2. 共有所有権のセマンティクス
    stop_sourcestop_token、およびstop_callbackは、ストップ状態の共有所有権のセマンティクスを実装しています。同じストップ状態を共有するstop_sourcestop_token、またはstop_callbackは、それぞれ関連するstop_sourcestop_token、またはstop_callbackです。ストップ状態の最後の所有者がそのリソースを自動的に解放します。
  3. ストップトークンの使用方法
    stop_tokenは操作に渡すことができ、操作は次のいずれかを実行できます。
    1. トークンを積極的にポーリングしてストップリクエストがあったかどうかを確認する。
    2. ストップリクエストがあった場合に呼び出されるコールバックをstop_callbackクラステンプレートを使用して登録する。
    ストップリクエストがstop_sourceを介して行われると、すべての関連するstop_tokenおよびstop_sourceオブジェクトに表示されます。一度行われたストップリクエストは取り消すことができません(後続のストップリクエストは効果がありません)。
  4. コールバックの呼び出し
    stop_callbackオブジェクトを介して登録されたコールバックは、関連するstop_sourceオブジェクトによって最初にストップリクエストが行われたときに呼び出されます。
  5. 関数呼び出しとデータ競合
    request_stopstop_requested、およびstop_possibleの関数呼び出しはデータ競合を引き起こしません。request_stopの呼び出しがtrueを返す場合、それは関連するstop_tokenまたはstop_sourceオブジェクトのstop_requestedの呼び出しと同期し、その呼び出しはtrueを返します。コールバックの登録は、そのコールバックの呼び出しと同期します。

33.3.2 ヘッダー<stop_token>の概要 (thread.stoptoken.syn)

編集

<stop_token>ヘッダーの概要は以下のように宣言されています。

namespace std {
    class stop_source;
    class stop_token;
    template <typename Callback>
    class stop_callback;
}

このヘッダーには、stop_sourcestop_token、およびstop_callbackという3つの主要なクラスが含まれています。stop_sourceはストップリクエストを発行するためのクラスであり、stop_tokenは操作に渡されるトークンです。stop_callbackはストップリクエストが行われた際に呼び出されるコールバックを登録するためのテンプレートクラスです。

各クラスは、非同期操作の停止を効果的に管理するためのメカニズムを提供します。これにより、不要な計算やリソースの浪費を避けることができます。