开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:线程取消点】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11064
线程取消点
内容介绍
一、线程取消点
二、调用 void pthread_testcancel 函数
一、线程取消点
线程被取消后,该线程并不是马上终止,默认情况下线程执行到消点时才能被终止。
1、在main函数当中,创建一个线程,然后sleep(3)秒取消线程,等待线程结束、main函数结束。
(1)、代码:
int main(int argc, char *argv[])
{
pthread_t tid1;
Int ret = 0 ;
ret = pthread_create(&tid1, NULL, thread_cancel, NULL);
If(ret != 0)
perror(“pthread_create”);
sleep(3);
pthread_cancel(tid1);
pthread_join(tid1,NULL);
return 0 ;
}
2、创建线程设置可以被取消
(1)、代码:
void *thread_cancel(void *arg)
{
//PTHREAD_CANCEL_ENABLE取消的状态可以被取消
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NUL);
//pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
while(1)
{
printf(“this is my new thread_cancel\n”);
sleep(1);
}
return NULL ;
}
运行代码:
[05_day]gcc pthread_cancel.c -o pthread_cancel -lpthread
[05_day]./pthread_cancel
this is my new thread_cancel
this is my new thread_cancel
this is my new thread_cancel
[05_day]
3秒钟被取消了。
3、在while(1)后面加上分号;
(1)、代码:
while(1);
/*{
printf(“this is my new thread_cancel\n”);
sleep(1);
}*/注释
代码运行结果:
[05_day]gcc pthread_cancel.c -o pthread_cancel -lpthread
[05_day]./pthread_cancel
//代码不会结束
sleep(3);//3秒之后
pthread_cancel(tid1);//取消
pthread_join(tid1,NULL);Return 0 ;//阻塞,因为线程没结束
return 0 ;
二、调用 void pthread_testcancel 函数
1、调用void pthread_testcancel函数相当于取消点,在循环里面可以调用此函数,当别的线程取消调用此函数的时候,被取消的线程执行到此函数时就结束。
(1)、代码:
void *thread_cancel(void *arg)
{
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NUL);
//pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
while(1)
pthread_testcancel();
/*{
printf(“this is my new thread_cancel\n”);
sleep(1);
}*/
return NULL ;
}
运行结果:
[05_day]gcc pthread_cancel.c -o pthread_cancel -lpthread
[05_day]./pthread_cancel
[05_day]
2、默认情况下,线程允许被取消,即便允许被取消,必须执行到取消点时才能被取消
(1)、代码:
void *thread_cancel(void *arg)
{
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NUL);
//pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
while(1)
{
printf(“this is my new thread_cancel\n”);
sleep(1);
}
return NULL ;
}
运行结果:
[05_day]gcc pthread_cancel.c -o pthread_cancel -lpthread
[05_day]./pthread_cancel
this is my new thread_cancel
this is my new thread_cancel
this is my new thread_cancel
[05_day]
POSIX.1保证线程在调用表1、表2中的任何函数时,取消点都会出现。
表1:
表2:
1、当执行到表1、表2两张表里面的函数时,就会出现取消点,然后被取消。
(1)、代码:
void *thread_cancel(void *arg)
{
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NUL);
//pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
while(1)
{
printf(“this is my new thread_cancel\n”);
sleep(1);//表1里的函数
}
return NULL ;
}
2、代码验证:
(1)、代码:
void *thread_cancel(void *arg)
{
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
while(1)
{
//pthread_testcancel();
}
return NULL;
(2)、在while里面加pthread_testcancel()和不加是有区别的,
不加的话就会取消不了,加了之后才能被成功取消。
要么调用函数pthrean_testcancel();
要么调用表1、表2里面的函数。