linux 使用pthread_cancel和pthread_join遇到的一些问题

直接看下边的代码吧,在测试过程中,67行和58行在线程推出后没有正确执行,所有设计程序的时候注意这些细节。

#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(10);
    pthread_exit(NULL);

}
int main1(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 ;
}

static int count = 0;
void run_printf()
{

        count++;
        pthread_testcancel();//和pthread_cancel是一对 
        printf("The thread_run method count is = %d\n",count);
        sleep(1);
        pthread_testcancel();//和pthread_cancel是一对 作为子线程的cancel point 退出子线程
        printf("The thread_run method game over ----> %d \n",count);//经测试推出子线程后 该语句未被执行

}
void* thread_run(void* parm)
{
    while(1)
    {
        run_printf();
    }
    printf("The thread_run method game over 2 \n");//经测试推出子线程后 该语句未被执行
    return NULL;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, NULL, thread_run,NULL);
    // 加入pthread_join后,主线程"main"会一直等待直到tid这个线程执行完毕自己才结束
    // 一般项目中需要子线程计算后的值就需要加join方法
    sleep(5);//等待5秒钟后触发cnecel信号
    pthread_cancel(tid);//这个只是触发信号,子线程不一定会立即结束pthread_testcancel是一对
    pthread_join(tid, NULL);//阻塞子线程程序 直至子线程结束后
    // 如果没有join方法可以看看打印的顺序
    printf("The count is = %d\n",count);

    return 0;
}

微信截图_20201111132448.png 

sitemap