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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • NOIP 2012 年普及组初赛试题整理「建议收藏」

    NOIP 2012 年普及组初赛试题整理「建议收藏」问题求解题目答案:5题目解析:贪心法。构造出最坏情况下至多选4点、不在同一条直线上,此时再添加任意一个点,则一定出现3点一线。题目答案:2880题目解析:圆排列问题。5名大陆选手的排列方案数为:5!5名港澳选手安排在大陆选手之间的5个空位的排列方案数为:5!总的排列方案数为:5!×5!。但每位选手左边相邻的选手均相同,为重复方案。最终结果为:阅读程序#include<iostream>usingnamespace..

    2022年8月22日
    7
  • 无问西东

    无问西东

    2021年9月27日
    48
  • 关于坑爹的编解码问题

    关于坑爹的编解码问题

    2021年5月26日
    118
  • SQL模糊查询语句(like)

    SQL模糊查询语句(like) 确定给定的字符串是否与指定的模式匹配。模式可以包含常规字符和通配符字符。模式匹配过程中,常规字符必须与字符串中指定的字符完全匹配。然而,可使用字符串的任意片段匹配通配符。与使用=和!=字符串比较运算符相比,使用通配符可使LIKE运算符更加灵活。如果任何参数都不属于字符串数据类型,MicrosoftSQLServer会将其转换成字符串数据类型(如果可能)。语法mat

    2022年5月26日
    174
  • ubuntu安装wget命令_linux bash命令

    ubuntu安装wget命令_linux bash命令我们先安装linux系统比如centos7.1里面有的就没有wget下载工具。wget这个命令就不可以使用。我们使用yum-yinstallwgetyuminstallperl会出现:[root@localhost~]#yum-yinstallwgetLoadedplugins:fastestmirrorRepodataisoverweeksold.Instal…

    2022年10月16日
    3

发表回复

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

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