名前空間
変種
操作

std::stop_source

From cppreference.com
< cpp‎ | thread
 
 
並行性サポートライブラリ
スレッド
(C++11)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
協調的なキャンセル
(C++20)
stop_source
(C++20)
排他制御
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
 
ヘッダ <stop_token> で定義
class stop_source;
(C++20以降)

stop_source クラスは、std::jthread のキャンセルなどの停止要求を発行する手段を提供します。ある stop_source オブジェクトに対して行われた停止要求は、同じ関連する停止状態のすべての stop_sourcestd::stop_token に可視です。関連する std::stop_token(s) のために登録された std::stop_callback(s) は呼び出され、関連する std::stop_token(s) で待機している std::condition_variable_any オブジェクトはすべて覚醒されます。

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

目次

[編集] メンバ関数

新しい stop_source オブジェクトを構築する
(public メンバ関数) [編集]
stop_source オブジェクトを破棄する
(public メンバ関数) [編集]
stop_source オブジェクトを代入する
(public メンバ関数) [編集]
変更
関連する停止状態があれば、それに対して停止要求を行う
(public メンバ関数) [編集]
2つの stop_source オブジェクトをスワップする
(public メンバ関数) [編集]
監視
関連する停止状態の stop_token を返す
(public メンバ関数) [編集]
関連する停止状態が停止を要求されているかどうかをチェックする
(public メンバ関数) [編集]
関連する停止状態が停止を要求できるかどうかをチェックする
(public メンバ関数) [編集]

[編集] 非メンバ関数

2つの std::stop_source オブジェクトを比較する
(関数) [編集]
std::swap アルゴリズムを特殊化する
(関数) [編集]

[編集] ヘルパータグ

構築時に関連する停止状態がないことを示すための stop_source 用のタグ
(タグ)[編集]

[編集] 備考

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

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

機能テストマクロ 規格 機能
__cpp_lib_jthread 201911L (C++20) Stop token および 結合スレッド

[編集]

#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");
    };
 
    // Common source
    std::stop_source stop_source;
 
    print(stop_source);
 
    // Create worker threads
    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);
 
    // Note: destructor of jthreads will call join so no need for explicit calls
}

実行結果の例

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
English 日本語 中文(简体) 中文(繁體)