r.h*_*.hg 21 c++ multithreading join detach c++11
什么是之间的不同join(),并detach()在C++多线程?是否join()杀死线程?
Mic*_*urr 33
C++ thread对象通常(但不总是)表示执行线程,它是OS或平台概念.
当thread::join()被调用时,调用线程将阻塞,直到执行线程已经完成.基本上,这是一种可用于了解线程何时完成的机制.当thread::join()返回时,执行的OS线程已完成和C++ thread对象可以被破坏.
在thread::detach()被调用时,执行的线程是从"超然" thread对象,不再由一个代表的thread对象-它们是两个独立的事情.thread可以销毁C++ 对象,并且可以继续执行OS执行线程.如果程序需要知道该执行线程何时完成,则需要使用其他一些机制.join()不能再调用该thread对象,因为它不再与执行线程相关联.
当C++ thread对象仍然是"可连接"时,它被认为是一个错误.也就是说,为了销毁C++ thread对象,join()需要调用(和完成)或detach()必须调用.如果C++ thread对象在被销毁时仍然可以连接,则会抛出异常.
C++ thread对象不代表执行线程的一些其他方式(即,可以是不可加入的):
thread对象不表示执行线程,因此不可连接.dim*_*-an 12
join()不杀死线程.实际上它一直等到线程主函数返回.所以如果你的线程主函数看起来像这样:
while (true) {
}
Run Code Online (Sandbox Code Playgroud)
join() 将要永远等待.
detatch()也不杀死线程.实际上它告诉std::thread该线程即使在std::thread对象被销毁时也应该继续运行.C++在std :: thread析构函数中检查该线程是加入还是分离,如果此检查失败,则终止程序.
因此,如果您main在以下代码的功能中取消注释第一行,它将崩溃.如果取消注释第二行或第三行,它将正常工作.
#include <thread>
void func() {
}
void fail1() {
std::thread t(func);
// will fail when we try to destroy t since it is not joined or detached
}
void works1() {
std::thread t(func);
t.join();
}
void works2() {
std::thread t(func);
t.detach();
}
int main() {
// fail1();
// works1();
// works2();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17672 次 |
| 最近记录: |