2016-05-03 114 views

回答

14

A C++ thread对象一般(但不总是)表示执行的线程,这是一个操作系统或平台的概念。

当调用thread::join()时,调用线程将阻塞,直到执行线程完成。基本上,这是一个可以用来知道线程何时完成的机制。当thread::join()返回时,OS执行线程已完成,C++ thread对象可能被销毁。

thread::detach()被调用时,执行的线程是“分离”从thread对象,并通过一个thread对象不再表示 - 它们是两个独立的东西。 C++ thread对象可以被销毁,并且OS的执行线程可以继续。如果程序需要知道该执行线程何时完成,则需要使用其他一些机制。 join()不能在该对象上调用,因为它不再与执行的线程相关联。

在仍然“可连接”的同时销毁C++ thread对象被认为是错误的。也就是说,为了摧毁C++ thread对象,必须调用join()(或完成)或必须调用detach()。如果C++ thread对象在被销毁时仍然可以连接,则会抛出异常。

其它一些方法,一个C++ thread对象将不能代表执行的线程(即,可以是不能加入。):

  • 默认构造thread对象不表示执行的线程,所以是不可连接。
  • 已经移动的线程将不再表示一个执行线程,因此不可连接。
3

join()不杀死线程。实际上它等到线程主函数返回。所以,如果你的线程的主要功能如下:

while (true) { 
} 

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(); 
} 
相关问题