大家好,又见面了,我是你们的朋友全栈君。
C++中的thread对象通常来说表达了执行的线程(thread of execution),这是一个OS或者平台的概念。
当thread::join()函数被调用后,调用它的线程会被block,直到线程的执行被完成。基本上,这是一种可以用来知道一个线程已结束的机制。当thread::join()返回时,OS的执行的线程已经完成,C++线程对象可以被销毁。
当thread::detach()函数被调用后,执行的线程从线程对象中被分离,已不再被一个线程对象所表达–这是两个独立的事情。C++线程对象可以被销毁,同时OS执行的线程可以继续。如果程序想要知道执行的线程何时结束,就需要一些其它的机制。join()函数在那个thread对象上不能再被调用,因为它已经不再和一个执行的线程相关联。
去销毁一个仍然可以“joinable”的C++线程对象会被认为是一种错误。为了销毁一个C++线程对象,要么join()函数需要被调用(并结束),要么detach()函数被调用。如果一个C++线程对象当销毁时仍然可以被join,异常会被抛出。
C++线程对象不被表达为执行的线程的其它的情况(也就是unjoinable):
- 默认构造的线程对象不表达为执行的线程,所以是unjoinable。
- 被移开的线程将不表达为执行的线程,所以是unjoinable。
- 线程没有被Joined(用t.join())
- 线程也没有被detached(用t.detach())
- 使用join
- 除非你需要更灵活并且想要独立地提供一种同步机制来等待线程完成,在这种情况下你应该使用detach
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132867.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...