void detach();
概要
スレッドの管理を手放す
要件
jthread
オブジェクトにスレッドが関連付けられていること(joinable() == true
)。
効果
this
に関連付けられていたスレッドはそのまま処理が続行される。またそのスレッドが完了した後には、処理系が同スレッドで利用していたリソース(スレッドローカル変数など)を解放する。一方、この関数を呼び出したスレッドはブロックされない。
事後条件
this
は何も指さない空のjthread
オブジェクトとなる。
例外
detach操作に失敗した場合、system_error
例外を投げる。
備考
- detachされたスレッドは、他のスレッドから直接アクセスすることが出来なくなる。ただし、
mutex
やfuture
オブジェクトなどを介して間接的に同期することは可能。 - detachされたスレッドに対して停止要求は引き続き発行できる。ただし、このクラスのデストラクタでは
request_stop()
は呼び出されなくなる
例
#include <iostream>
#include <thread>
#include <future>
std::future<int> start_async(int x, int y)
{
std::packaged_task<int(std::stop_token)> task([x,y](std::stop_token stoken) {
// 非同期実行されるタスク...
if (stoken.stop_requested()) { return -1; }
return x + y;
});
auto ftr = task.get_future();
// 新しいスレッド作成後にdetach操作
std::jthread t(std::move(task));
t.detach();
return ftr;
// 変数tにはスレッドが紐付いていないため破棄可能
}
int main()
{
auto result = start_async(1, 2);
//...
std::cout << result.get() << std::endl;
}
xxxxxxxxxx
#include <iostream>
#include <thread>
#include <future>
std::future<int> start_async(int x, int y)
{
std::packaged_task<int(std::stop_token)> task([x,y](std::stop_token stoken) {
// 非同期実行されるタスク...
if (stoken.stop_requested()) { return -1; }
return x + y;
});
auto ftr = task.get_future();
// 新しいスレッド作成後にdetach操作
std::jthread t(std::move(task));
t.detach();
return ftr;
// 変数tにはスレッドが紐付いていないため破棄可能
}
int main()
{
auto result = start_async(1, 2);
//...
std::cout << result.get() << std::endl;
}
出力
3
バージョン
言語
- C++20
処理系
- Clang:
- GCC: 10.2.0 ✅
- Visual C++: ??