std:: stop_source
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
| Non-member functions | ||||
| Helper tags | ||||
|
定義済みヘッダー
<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
オブジェクトを比較する
(関数) |
|
(C++20)
|
std::swap
アルゴリズムを特殊化する
(関数) |
ヘルパータグ
|
(C++20)
|
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