永发信息网

C++中的std:thread的join函数与detach函数有什么区别

答案:2  悬赏:40  手机版
解决时间 2021-12-19 10:21
C++中的std:thread的join函数与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
全部回答
join是阻塞当前线程,并等待object对应线程结束,该线程继续执行 detach是将线程从当前线程分离出去,即不受阻塞,操作系统会将其独立对待
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
请推荐几本现代小说,类似《围城》、《平凡的
单选题以下结论不正确?的是A.在回归直线y=0.5
行程控制的工作原理
黑名单入深户怎么搞
单选题下列关于辩证法和形而上学与唯物主义和
青行灯少年霜要歌曲!
买皮卡是4驱好还是2驱好
高纬度地区入海口多沼泽的原因
小堤东村委会办公位置在哪啊?好找么?
一元二次方程x2-4x=-3的一般形式为:________
如何在win10中查看nas
刘石桥村委会地址在什么地方?想过去办事
单选题积极参加废奴运动的黑人领袖:A.圣马丁
请问当乐游戏中心帐号申诉成功后怎么办?
单选题对“心性论”和“心学”共同之处的认识
推荐资讯
从氢气、二氧化碳、二氧化硫、氮气、氦气五种
85版本44独立和30力量哪个好
某英文报社就家务劳动(Housework)这一话题
已知三数成等差数列,它们的和为18,它们的平
qq申诉的时候有提示吗?
怎样从深圳龙华富士康上班到河南富士康上班
羊肚菌出口的主要地方是哪里 50分
梦到好多白色的小猫在我家院子里
西宁市国土资源局办公地址在什么地方?我要处
结印的手势
以《我喜欢的一句名言——成功是屡遭失败而热
暖风机有辐射吗
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?