// 原文部分摘录自:http://blog.csdn.net/xibeichengf/article/details/71173543
在任何一个时间点上,线程是可结合的(joinable)或者分离的(detached)。一个可结合的线程能够被其它线程回收资源和杀死。在被其它线程回收之前,它的存储器资源(例如栈)是没有被释放的。相反一个分离的线程是不能被其它线程回收或者杀死的。它的存储器资源在它终止时由系统自动释放。
当thread::join()函数被调用后,调用它的线程会被阻塞(block),直到线程的执行被完成。基本上,这是一种可以用来知道一个线程已结束的机制。当thread::join()返回时,OS的执行的线程已经完成,C++线程对象可以被销毁。
当thread::detach()函数被调用后,执行的线程从线程对象中被分离。C++线程对象可以被销毁,同时OS执行的线程可以继续。如果程序想要知道执行的线程何时结束,就需要一些其它的机制。
join()函数在被detach的线程thread对象上不能再被调用,因为它已经不再和一个执行的线程相关联。
去销毁一个仍然可以“joinable”的C++线程对象会被认为是一种错误。为了销毁一个C++线程对象,要么join()函数需要被调用(并结束),要么detach()函数被调用。如果一个C++线程对象当销毁时仍然可以被join,异常会被抛出。