[nptl][pthread]一种判断thread是否在执行的方法
![作者头像](https://ask.qcloudimg.com/avatar/154642/qgz7fyh2z0.jpg)
前言: 主线程中怎么确定某线程是否在执行? 作者遇到这个问题,第一感觉有点蒙。翻了一下glibc的代码,算是找到一个比较好的办法吧。 1,变量控制 这个很简单,在线程执行进入的时候,写控制变量running = true。线程将要退出的时候,写控制变量running = false,判断running这个变量就可以知道线程是否在执行了。 这个方法简单粗暴,在绝大多数的情况下都是能工作的。但是,有一种比较极端的情况:某线程正好赋值完控制变量,但是函数体还没有结束(对应的内核task当然也还在),这是主线程读取到的控制变量符合条件了,可是线程还没有结束。 使用tgkill给某线程发送信号。看一看tgkill的返回值:ESRCH No process with the specified thread ID (and thread group ID) exists. 如果返回了这个返回值,就说明线程已经退出了。 但是还是会有极端情况:例如给线程分配了1234,线程执行完,其他进程被分配了1234,那么这种方法就不能判断了。 3,try join 先看一段代码,glibc-2.23/nptl/pthread_tryjoin.c:
![](https://ask.qcloudimg.com/http-save/yehe-154642/wpvgxr5zps.jpeg)
可见,pthread_tryjoin首先不会block住,如果线程还没有执行完,会返回EBUSY。所以,通过判断pthread_tryjoin的返回值是不是EBUSY就可以判断出来了。