有时我必须使用 std::thread
来加速我的应用程序。我也知道 join()
等到一个线程完成。这很容易理解,但是调用 detach()
和不调用有什么区别呢?
我认为没有 detach()
,线程的方法将独立使用线程工作。
不分离:
void Someclass::Somefunction() {
//...
std::thread t([ ] {
printf("thread called without detach");
});
//some code here
}
使用分离调用:
void Someclass::Somefunction() {
//...
std::thread t([ ] {
printf("thread called with detach");
});
t.detach();
//some code here
}
原文由 Jinbom Heo 发布,翻译遵循 CC BY-SA 4.0 许可协议
在
std::thread
std::terminate
析构函数中,如果:t.join()
)t.detach()
)因此,在执行流到达析构函数之前,您应该始终使用
join
或detach
一个线程。当程序终止时(即
main
返回),不会等待在后台执行的剩余分离线程;相反,它们的执行被暂停并且它们的线程本地对象被破坏。至关重要的是,这意味着 _这些线程的堆栈不会展开_,因此某些析构函数不会被执行。根据这些析构函数应该执行的操作,这可能与程序崩溃或被杀死一样糟糕。希望操作系统会释放对文件等的锁定……但您可能已经损坏了共享内存、半写文件等。
那么,您应该使用
join
还是detach
?join
detach