最終更新日時(UTC):
が更新

履歴 編集

function
<thread>

std::jthread::detach(C++20)

void detach();

概要

スレッドの管理を手放す

要件

jthreadオブジェクトにスレッドが関連付けられていること(joinable() == true)。

効果

thisに関連付けられていたスレッドはそのまま処理が続行される。またそのスレッドが完了した後には、処理系が同スレッドで利用していたリソース(スレッドローカル変数など)を解放する。一方、この関数を呼び出したスレッドはブロックされない。

事後条件

thisは何も指さない空のjthreadオブジェクトとなる。

例外

detach操作に失敗した場合、system_error例外を投げる。

備考

  • detachされたスレッドは、他のスレッドから直接アクセスすることが出来なくなる。ただし、mutexfutureオブジェクトなどを介して間接的に同期することは可能。
  • 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;
}

出力

3

バージョン

言語

  • C++20

処理系