栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++】join()和detach|不join()也不detach()的后果

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++】join()和detach|不join()也不detach()的后果

一、join()和detach() join

join():主线程调用d2.join()后,需要等d2待子线程运行结束了,才会继续往下走。

int main()
 {
     d2 = std::thread(download2);
     download1();
     d2.join(); //主线程main需要等d2子线程(download2)结束了才会往下走去执行后面的process
     process();
 }

看这个:C++ std::thread join()的理解 - 代萌 - 博客园

        如果join()放到主线程最后,就表示主线程要等子线程结束自己才能结束。

detach

detach()称为分离线程函数,使用detach()函数会让线程在后台运行,即说明主线程不会等待子线程运行结束才结束。

总结
  • 在一个线程中,开了另一个线程去干另一件事,使用join函数后,原始线程会等待新线程执行结束之后,再去销毁线程对象。
  • 这样有什么好处?---->因为它要等到新线程执行完,再销毁,线程对象,这样如果新线程使用了共享变量,等到新线程执行完再销毁这个线程对象,不会产生异常。
  • 如果不使用join,使用detch,那么新线程就会与原线程分离,如果原线程先执行完毕,销毁线程对象及局部变量,并且新线程有共享变量或引用之类,这样新线程可能使用的变量,就变成未定义,产生异常或不可预测的错误。
  • 所以,当你确定程序没有使用共享变量或引用之类的话,可以使用detch函数,分离线程。
  • 但是使用join可能会造成性能损失,因为原始线程要等待新线程的完成,所以有些情况(前提是你知道这种情况,如上)使用detch会更好。

C++ 多线程join()和detach()的理解_皮皮#2500-CSDN博客

二、既不join()也不detach()的后果

创建一个可运行(创建时传入线程函数)的线程对象后,必须对该线程对象进行处理,要么调用join(),要么调用detach(),否则线程对象析构时程序将直接退出。

原因:

C++11中,线程对象(std::thread)创建后,有两种状态:

joinable
nonjoinable

状态转换:
线程对象通过默认构造函数构造后状态为nonjoinable;

线程对象通过有参构造函数创建后状态为joinable。

joinable状态的线程对象被调用join()或者detach()会变成nonjoinable状态。

线程对象析构


线程对象析构时,会判断线程的状态。如果线程处于nonjoinable状态时,会调用terminate()函数直接令程序退出。

VisualStudio中的实现版本为:

~thread() _NOEXCEPT
{	// clean up
	if (joinable())
		_XSTD terminate();
}


也就是说,创建一个可运行(创建时传入线程函数)的线程对象后,必须对该线程对象进行处理,要么调用join(),要么调用detach(),否则线程对象析构时程序将直接退出。
原文链接:https://blog.csdn.net/xp178171640/article/details/118548150

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290582.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号