- thread[meta header]
- std[meta namespace]
- class[meta id-type]
- cpp20[meta cpp]
namespace std {
class jthread;
}
クラスjthread
は、thread
と同じく、新しい実行のスレッド(thread of execution)(以下、単にスレッドとする)の作成/待機/その他操作を行う機構を提供する。このクラスはさらに、実行しているスレッドに対する停止要求を扱う機能や、自動でjoin
操作を行う機能を提供する。
- 停止要求のサポート:
jthread
は自身と関連付けられたスレッドに対する停止要求を扱う仕組みを提供する。このために<stop_token>
ヘッダに定義されたクラスを利用する。
- 自動join機能:
jthread
はデストラクタやムーブ代入演算子が呼び出されたとき、もし自身に関連付けられたスレッドが存在する場合は、スレッドの停止要求を作成し、その後join()
を呼び出してスレッドの終了を待機する。そのためthread
クラスと異なり、joinable()
==
true
であってもデストラクタやムーブ代入演算子を呼び出し可能であり、std::terminate()
は呼び出されない。
名前 |
説明 |
対応バージョン |
id |
スレッド識別子 (type-alias) |
C++20 |
native_handle_type |
ネイティブハンドル型 (type-alias)[処理系定義] |
C++20 |
名前 |
説明 |
対応バージョン |
swap |
2つのjthread オブジェクトを入れ替える |
C++20 |
- 型
native_handle_type
およびメンバ関数native_handle
について、同メンバの存在有無およびその意味は処理系定義となる。
- 型
id
および型native_handle_type
は、thread
クラスで定義しているものと同じものを使用する。
#include <cassert>
#include <thread>
int main()
{
int x = 0, y = 0;
std::jthread t([&](std::stop_token st) { x++; });
// スレッドに対する停止要求の作成に合わせて呼び出される
// コールバックを定義する。
std::stop_callback sc { t.get_stop_token(), [&] { y++; }};
assert(y == 0);
// 明示的にjoin()を呼び出さずにtを上書きする。
// このとき、ムーブ代入演算子の呼び出しの中で、
// 自動で停止要求の作成とjoin()の呼び出しが行われる。
t = std::jthread{};
assert(x == 1 && y == 1);
return 0;
}
- std::jthread[link jthread.md]
- std::stop_token[link /reference/stop_token/stop_token.md]
- std::stop_callback[link /reference/stop_token/stop_callback.md]
- get_stop_token()[link jthread/get_stop_token.md.nolink]