Linux c 无限创建同一个功能的线程存在就退出查看线程是否存活
有这样的一个应用场景。
线程A 在指令触发后需要创建线程B,线程B启动后,成功运行,内部将有一个循环直到完成任务,同时线程A 不影响将会继续完成后续的任务。
要求每次定时进入创建线程B 来定时检测是否完成任务,如果没有完成则 再创建一个同样功能的线程继续按上述内容执行。
使用到的函数:
pthread_create,
pthread_kill 是一个类似的探针,来探测id的线程是个否存活。
int pthread_kill(pthread_t thread, int sig);
向指定ID的线程发送sig信号,如果线程代码内不做处理,则按照信号默认的行为影响整个进程,也就是说,如果你给一个线程发送了SIGQUIT,但线程却没有实现signal处理函数,则整个进程退出。
pthread_kill(threadid, SIGKILL)也一样,杀死整个进程。
如果要获得正确的行为,就需要在线程内实现signal(SIGKILL,sig_handler)了。
所以,如果int sig的参数不是0,那一定要清楚到底要干什么,而且一定要实现线程的信号处理函数,否则,就会影响整个进程。
OK,如果int sig是0呢,这是一个保留信号,一个作用是用来判断线程是不是还活着。
我们来看一下pthread_kill的返回值:
成功:0
线程不存在:ESRCH
信号不合法:EINVAL
源码如下
[lv]
#include<stdlib.h> #include<pthread.h> #include<stdio.h> #include<sched.h> #include<errno.h> void*consumer(void*p) { //这句代码,主要是为了测试用的,说白了就是等到所有线程创建完毕后,在输出线程标识符 printf("create (%lu) %lu\n",pthread_self(),(*(unsigned long int*)p));//注意这个格式 sleep(2); pthread_exit(NULL); } int main(int argc,char*argv[]) { printf("(%lu)\n",pthread_self()); unsigned long int tt1; int i=1; int ret ; do { pthread_t t1; sleep(1); int kill_rc = pthread_kill(t1,0); if(kill_rc == ESRCH) printf("the specified thread (%lu) did not exists or already quit\n",t1); else if(kill_rc == EINVAL) printf("signal is invalid\n"); else{ printf("the specified thread (%lu) is alive\n",t1); continue; } ret=pthread_create(&t1,NULL,consumer,(void *)&t1); if(ret!=0) { printf("create failed,%d\n",ret); exit(1); } i++; printf("current pthread num:%d \n",i); } while(1); sleep(20); return 0 ; }
[/lv]
the specified thread (139832507389696) is alive the specified thread (139832507389696) did not exists or already quit current pthread num:293 create (139832498996992) 139832498996992 the specified thread (139832498996992) is alive the specified thread (139832498996992) is alive the specified thread (139832498996992) did not exists or already quit current pthread num:294 create (139832490604288) 139832490604288 the specified thread (139832490604288) is alive the specified thread (139832490604288) is alive the specified thread (139832490604288) did not exists or already quit current pthread num:295 create (139832482211584) 139832482211584 the specified thread (139832482211584) is alive the specified thread (139832482211584) did not exists or already quit current pthread num:296 create (139832473818880) 139832473818880 the specified thread (139832473818880) is alive the specified thread (139832473818880) did not exists or already quit current pthread num:297 create (139832465426176) 139832465426176 the specified thread (139832465426176) is alive the specified thread (139832465426176) is alive the specified thread (139832465426176) did not exists or already quit current pthread num:298 create (139832457033472) 139832457033472
但是在嵌入式上 比如在树莓派上运行会导致崩溃,下面提供第二种方案
bool is_thread_alive(pthread_t tid) { bool bAlive = false; if(tid) { int ret = pthread_tryjoin_np(tid, NULL); if (ret != 0) { /* Handle error */ if(EBUSY == ret) { bAlive = true; } } } return bAlive; }