前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++多线程中的join, detach, joinable

C++多线程中的join, detach, joinable

作者头像
Ch_Zaqdt
发布2020-02-16 13:50:21
6.7K0
发布2020-02-16 13:50:21
举报
文章被收录于专栏:Zaqdt_ACMZaqdt_ACM

       thread是C++11中提供多线程编程的模块,使用的时候需要包含<thread>头文件。

       首先我们先来看一下简单的hello world的多线程的代码(win10下vs2019)

       这个创建的方式就是以函数作为一个入口,创建了一个子线程,那么创建的语句就是第11行代码所示,所传入的参数就是入口的函数名。在创建了这个子线程之后,这个子线程就开始运行了,同时主线程也不停的往下运行,当碰到t.join()这句代码的时候,就表示主线程需要等待子线程运行结束回收掉子线程的资源后,再往下运行,否则就会产生一种情况:当子线程还没有运行完主线程先运行完了,那么就会结束这个进程,从而中断了子线程的运行。因此join()函数的作用就是使主线程在此阻塞,等待子线程运行结束并回收其资源,再往下运行。

       当然我们可以用this_thread::get_id()这个函数来验证这个子线程和主线程是不同的两个线程,结果如下图所示

       可见两个线程的id是不同的。

       然后我们再看一下下面的这个图,用的是detach函数:

       从这个图中我们可以发现fun和main是交叉着输出的,并不是先输出fun中的内容,那么detach的作用就是将主线程与子线程分离,主线程将不再等待子线程的运行,也就是说两个线程同时运行,当主线程结束的时候,进程结束。

       那么可能就会产生一些疑问,那这样不就中断了子线程的运行吗?

       其实不是,在detach的时候,这个子线程将脱离主线程的控制,子线程独立分离出去并在后台运行。当主线程结束的时候,进程也就结束,所以子线程的输出不再显示出来,但是不会中断,会在后台继续运行,当子线程运行完以后,资源会被运行时库进行回收。

       joinable()函数是一个布尔类型的函数,他会返回一个布尔值来表示当前的线程是否是可执行线程(能被join或者detach),因为相同的线程不能join两次,也不能join完再detach,同理也不能detach,所以joinable函数就是用来判断当前这个线程是否可以joinable的。通常不能被joinable有以下几种情况:

       1)由thread的缺省构造函数而造成的(thread()没有参数)。

       2)该thread被move过(包括move构造和move赋值)。

       3)该线程被join或者detach过。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档