std::stop_source
From cppreference.com
| ヘッダ <stop_token> で定義 |
||
| class stop_source; |
(C++20以降) | |
stop_source クラスは、std::jthread のキャンセルなどの停止要求を発行する手段を提供します。ある stop_source オブジェクトに対して行われた停止要求は、同じ関連する停止状態のすべての stop_source と std::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 メンバ関数) | |
[編集] 非メンバ関数
| (C++20) |
2つの std::stop_source オブジェクトを比較する(関数) |
| (C++20) |
std::swap アルゴリズムを特殊化する (関数) |
[編集] ヘルパータグ
| (C++20) |
構築時に関連する停止状態がないことを示すための 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