linux系统编程之杀死线程

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

输出:
linux系统编程之杀死线程_第1张图片
线程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);
 
}

输出:
linux系统编程之杀死线程_第2张图片

你可能感兴趣的:(linux,linux)