在C++中多线程的join()和detach()有什么不同?

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)


sim*_*bor 8

简单来说,这两种方法都会启动一个新线程,但是 -

after detach() execution main thread continues running
after join() execution main thread pauses and waits until the new thread ends

通过微软文档

享受!