pthread_cancel函数
杀死(取消)线程
其作用,对应进程中 kill() 函数。
函数原型:int pthread_cancel(pthread_t thread);
成功:0;失败:错误号
【注意】:线程的取消并不是实时的,而有一定的延时。需要等待线程到达某个取消点(检查点)。
取消点:是线程检查是否被取消,并按请求进行动作的一个位置。通常是一些系统调用creat,open,pause,close,read,write… 执行命令man 7 pthreads可以查看具备这些取消点的系统调用列表。也可参阅 APUE.12.7 取消选项小节。
可粗略认为一个系统调用(进入内核)即为一个取消点。如线程中没有取消点,可以通过调用pthreestcancel函数自行设置一个取消点。
被取消的线程, 退出值定义在Linux的pthread库中。常数PTHREAD_CANCELED的值是-1。可在头文件pthread.h中找到它的定义:#define PTHREAD_CANCELED ((void *) -1)。因此当我们对一个已经被取消的线程使用pthread_join回收时,得到的返回值为-1。
实例:杀死线程的三种方法
#include
#include
#include
#include
void * tfn1(void * arg)
{
pritnf("thread 1 runing\n");
return (void*)111;
}
void * tfn2(void * arg)
{
pritnf("thread 2 runing\n");
return (void*)222;
}
void * tfn3(void * arg)
{
while(1)
{
}
return (void *)666;
}
int main(void)
{
pthread_t tid;
void * tret =NULL;
pthread_creat(*tid,NULL,tfn1,NULL) ;
pthread_join(tid,&tret);
printf("thread 1 exit code =%d\n",(int)tret);
pthread_creat(*tid,NULL,tfn2,NULL) ;
pthread_join(tid,&tret);
printf("thread 2 exit code =%d\n",(int)tret);
pthread_creat(*tid,NULL,tfn2,NULL) ;
sleep(3);
pthread_cancel(tid);
pthread_join(tid,&tret);
printf("thread 3 exit code =%d\n",(int)tret);
}
输出:
线程3没死,因为pthread_cancel 杀死线程不是实时的,只有到达取消点才能杀死
取消点:系统调用,函数调用
情况一:
系统调用当取消点
#include
#include
#include
#include
void * tfn1(void * arg)
{
pritnf("thread 1 runing\n");
return (void*)111;
}
void * tfn2(void * arg)
{
pritnf("thread 2 runing\n");
return (void*)222;
}
void * tfn3(void * arg)
{
while(1)
{
printf("thread 3: I'm going to die in 3 seconds ...\n");
/sleep(1);
}
return (void *)666;
}
int main(void)
{
pthread_t tid;
void * tret =NULL;
pthread_creat(*tid,NULL,tfn1,NULL) ;
pthread_join(tid,&tret);
printf("thread 1 exit code =%d\n",(int)tret);
pthread_creat(*tid,NULL,tfn2,NULL) ;
pthread_join(tid,&tret);
printf("thread 2 exit code =%d\n",(int)tret);
pthread_creat(*tid,NULL,tfn2,NULL) ;
sleep(3);
pthread_cancel(tid);
pthread_join(tid,&tret);
printf("thread 3 exit code =%d\n",(int)tret);
}
结果:
线程3调用了系统调用,所以pthread_cancel能杀死线程
情况二:
自己添加取消点:pthread_testcancel()
#include
#include
#include
#include
void * tfn1(void * arg)
{
pritnf("thread 1 runing\n");
return (void*)111;
}
void * tfn2(void * arg)
{
pritnf("thread 2 runing\n");
return (void*)222;
}
void * tfn3(void * arg)
{
while(1)
{
phread_testcancel() ;//自己添加取消点
}
return (void *)666;
}
int main(void)
{
pthread_t tid;
void * tret =NULL;
pthread_creat(*tid,NULL,tfn1,NULL) ;
pthread_join(tid,&tret);
printf("thread 1 exit code =%d\n",(int)tret);
pthread_creat(*tid,NULL,tfn2,NULL) ;
pthread_join(tid,&tret);
printf("thread 2 exit code =%d\n",(int)tret);
pthread_creat(*tid,NULL,tfn2,NULL) ;
sleep(3);
pthread_cancel(tid);
pthread_join(tid,&tret);
printf("thread 3 exit code =%d\n",(int)tret);
}