- thread[meta header]
- std[meta namespace]
- thread[meta class]
- function[meta id-type]
- cpp11[meta cpp]
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;
}- detach()[color ff0000]
- std::future[link /reference/future/future.md]
- std::packaged_task[link /reference/future/packaged_task.md]
- task.get_future()[link /reference/future/packaged_task/get_future.md]
- std::move[link /reference/utility/move.md]
- result.get()[link /reference/future/future/get.md]
3
- C++11
- Clang:
- GCC: 4.6.3 [mark verified], 4.7.0 [mark verified]
- ICC:
- Visual C++: 2012 [mark verified], 2013 [mark verified], 2015 [mark verified]