thread中join和detach的区别

thread中join和detach的区别C++中的thread对象通常来说表达了执行的线程(threadofexecution),这是一个OS或者平台的概念。当thread::join()函数被调用,调用它的线程会被block,直到线程的执行被完成。基本上,这是一种可以用例知道一个线程已结束的机制。当thread::join()返回时,OS的执行的线程已经完成,C++线程对象可以被销毁。当thread::detach()函数

大家好,又见面了,我是你们的朋友全栈君。

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。
在std::thread的析构函数中,std::terminate会被调用如果:
  • 线程没有被Joined(用t.join())
  • 线程也没有被detached(用t.detach())
因此,你应该在执行流程到析构函数前总是要么join,要么detach一个线程。
当一个程序终止时(比如main返回),剩下的在后台的detached线程执行不会再等待;相反它们的执行会被挂起并且它们的本地线程对象会被销毁。
关键地,这意味着这些线程的栈不是完好无损的,因此一些析构函数不会被执行。依赖于这些行为,一些析构函数假象会被承担,这可能是一种坏情形,好像程序已经Crash或者已经被kill。希望OS会释放加在这些文件上的锁。Depending on the actions those destructors were supposed to undertake, this might be as bad a situation as if the program had crashed or had been killed. Hopefully the OS will release the locks on files, etc… but you could have corrupted shared memory, half-written files, and the like.
所以,你应该使用join还是detached?
  • 使用join
  • 除非你需要更灵活并且想要独立地提供一种同步机制来等待线程完成,在这种情况下你应该使用detach
本文翻译自
这里
这里

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132867.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C Delegates 委托

    C Delegates 委托C Delegates 委托通常我们都是把数据作为参数传递给方法 inti int Parse 99 当需要把方法传送给其他方法时就需要使用委托 类的用法 首先声明一个类 接着实例化一个类 委托的用法和类的用法类似 首先定义委托告诉编译器这种类型的委托表示哪种类型的方法 接着创建该委托的一个或者多个实例 声明委托委托的类型安全性非常高 在定义委托时必须给出他所表示的方法的签名

    2025年9月4日
    2
  • VIF-Net:RGB和红外图像融合的无监督框架

    VIF-Net:RGB和红外图像融合的无监督框架VIF Net 红外和可见图像融合的无监督框架

    2025年10月18日
    4
  • mysql的左连接和右连接(内连接和自然连接的区别)

    获取boy、girl表下载地址一、内连接查询innerjoin关键字:innerjoinon语句:select*froma_tableainnerjoinb_tablebona.a_id=b.b_id;说明:组合两个表中的记录,返回关联字段相符的记录,也就是返回两个表的交集(阴影)部分。案例解释:在boy表和girl表中查出…

    2022年4月11日
    60
  • TortoiseSVN中分支和合并实践

    TortoiseSVN中分支和合并实践

    2021年8月19日
    66
  • Server unexpectedly closed network connection的解决

    Server unexpectedly closed network connection的解决(1)apt-getremoveopenssh-server(2)sudoaptinstallopenssh-server(3)sudoservicesshstart(4)ps-aux|grepssh(5)sudoaptinstallopenssh-client(6)工具重连…

    2022年10月21日
    1
  • sdn小结(一)_SDN的基本概念

    sdn小结(一)_SDN的基本概念看了一周的sdn,写下一点总结和心得体会。1.sdn中不一定非得用openflow来作为南向协议,其他的南向接口协议还有很多,比如pcep,netconf,snmp,bgp-ls2.segmentrouting也需要一个集中的控制器,只要硬件条件支持,sr可以和sdn进行结合3.ECMP通过对流的数据包头部进行哈希取模运算,将数据流映射到不同的转发路径4.谷歌的B4采取的是i…

    2025年9月24日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号