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;
}

sitemap