最終更新日時(UTC): 2024年06月11日 13時45分38秒
Akira Takahashi が更新

履歴 編集

function
<thread>

# std::thread::detach(C++11)

    void detach();

## 概要

スレッドの管理を手放す

## 要件

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

## 効果

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

## 事後条件

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

## 例外

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

## 備考

detachされたスレッドは、他のスレッドから直接アクセスすることが出来なくなる。ただし、`mutex`や`future`オブジェクトなどを介して間接的に同期することは可能。

## 例

    #include <iostream>
    #include <thread>
    #include <future>

    std::future<int> start_async(int x, int y)
    {
      std::packaged_task<int()> task([x,y]{
        // 非同期実行されるタスク...
        return x + y;
      });
      auto ftr = task.get_future();

      // 新しいスレッド作成後にdetach操作
      std::thread 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++11

### 処理系

- Clang:
- GCC: 4.6.3 ✅, 4.7.0 ✅
- ICC:
- Visual C++: 2012 ✅, 2013 ✅, 2015 ✅

## 参照