Namespaces
Variants

std:: stop_source

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
定義済みヘッダー <stop_token>
class stop_source ;
(C++20以降)

stop_source クラスは、 std::jthread のキャンセルなど、停止要求を発行する手段を提供します。ある stop_source オブジェクトに対して行われた停止要求は、同じ関連付けられた停止状態を持つ全ての stop_source および std::stop_token に対して可視となります。関連付けられた std::stop_token に登録された std::stop_callback は呼び出され、関連付けられた std::stop_token を待機している std::condition_variable_any オブジェクトは起床されます。

停止が要求されると、取り消すことはできません。追加の停止要求は効果がありません。

目次

メンバー関数

新しい stop_source オブジェクトを構築する
(public member function)
stop_source オブジェクトを破棄する
(public member function)
stop_source オブジェクトを代入する
(public member function)
修飾子
関連付けられた停止状態に対して停止要求を行う(存在する場合)
(public member function)
2つの stop_source オブジェクトを交換する
(public member function)
オブザーバー
関連付けられた停止状態の stop_token を返す
(public member function)
関連付けられた停止状態に対して停止要求が行われたかどうかをチェックする
(public member function)
関連付けられた停止状態が停止要求を受けられるかどうかをチェックする
(public member function)

非メンバー関数

(C++20)
二つの std::stop_source オブジェクトを比較する
(関数)
std::swap アルゴリズムを特殊化する
(関数)

ヘルパータグ

stop_source が構築時に停止状態を関連付けないことを示すために使用されるタグ
(タグ)

注記

std::jthread のキャンセル処理においては、 stop_source オブジェクトは std::jthread オブジェクトから get_stop_source() を使用して取得すべきです。あるいは、停止要求は std::jthread オブジェクトから直接 request_stop() を使用して要求すべきです。これにより、 std::jthread の呼び出された関数引数(すなわち、そのスレッドで実行されている関数)に渡されたものと同じ関連付けられた停止状態が使用されます。

他の用途では、デフォルトコンストラクタを使用して個別に stop_source を構築できます。これにより新しい停止状態が作成されます。

機能テスト マクロ 標準 機能
__cpp_lib_jthread 201911L (C++20) Stop token および joining thread

#include <chrono>
#include <iostream>
#include <stop_token>
#include <thread>
using namespace std::chrono_literals;
void worker_fun(int id, std::stop_token stoken)
{ 
    for (int i = 10; i; --i)
    {
        std::this_thread::sleep_for(300ms);
        if (stoken.stop_requested())
        {
            std::printf("  worker%d is requested to stop\n", id);
            return;
        }
        std::printf("  worker%d goes back to sleep\n", id);
    }
}
int main()
{
    std::jthread threads[4];
    std::cout << std::boolalpha;
    auto print = [](const std::stop_source& source)
    {
        std::printf("stop_source stop_possible = %s, stop_requested = %s\n",
                    source.stop_possible() ? "true" : "false",
                    source.stop_requested() ? "true" : "false");
    };
    // 共通のソース
    std::stop_source stop_source;
    print(stop_source);
    // ワーカースレッドの作成
    for (int i = 0; i < 4; ++i)
        threads[i] = std::jthread(worker_fun, i + 1, stop_source.get_token());
    std::this_thread::sleep_for(500ms);
    std::puts("Request stop");
    stop_source.request_stop();
    print(stop_source);
    // 注: jthreadのデストラクタはjoinを呼び出すため、明示的な呼び出しは不要
}

出力例:

stop_source stop_possible = true, stop_requested = false
  worker2 goes back to sleep
  worker3 goes back to sleep
  worker1 goes back to sleep
  worker4 goes back to sleep
Request stop
stop_source stop_possible = true, stop_requested = true
  worker3 is requested to stop
  worker1 is requested to stop
  worker2 is requested to stop
  worker4 is requested to stop