直接看下边的代码吧,在测试过程中,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;
}