• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function
    <thread>

    std::jthread::detach

    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

    処理系