《UNIX环境高级编程》学习记录之第11章-线程--pthead_testcancel()

#include <pthread.h>
void pthread_testcancel(void)

文章转载自:罗索实验室 [http://www.rosoo.net/a/201112/15522.html]

pthread_testcancel() function creates a cancellation point in the calling thread. If cancelability is currently disabled, this function has no effect. For more information on cancelability, see Thread cancellation APIs.

When cancelability is disabled, all cancels are held pending in the target thread until the thread changes the cancelability. When cancelability is deferred, all cancels are held pending in the target thread until the thread changes the cancelability, calls a function that is a cancellation point, or calls pthread_testcancel(), thus creating a cancellation point. When cancelability is asynchronous, all cancels are acted upon immediately, interrupting the thread with its processing.
You should not use asynchronous thread cancellation via the PTHREAD_CANCEL_ASYNCHRONOUS option of pthread_setcanceltype(). See the common user errors section of this document for more information.
#define _MULTI_THREADED 
#include <pthread.h> 
#include <stdio.h> 
#include "check.h" 
 
void cleanupHandler(void *parm) { 
  printf("Inside cancellation cleanup handler/n"); 
} 
 
void *threadfunc(void *parm) 
{ 
  unsigned int  i=0; 
  int           rc=0, oldState=0; 
  printf("Entered secondary thread/n"); 
  pthread_cleanup_push(cleanupHandler, NULL); 
  rc = pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState); 
  checkResults("pthread_setcancelstate()/n", rc); 
  /* Allow cancel to be pending on this thread */ 
  sleep(2); 
  while (1) { 
    printf("Secondary thread is now looping/n"); 
    ++i; 
    sleep(1); 
    /* pthread_testcancel() has no effect until cancelability is enabled.*/ 
    /* At that time, a call to pthread_testcancel() should result in the */ 
    /* pending cancel being acted upon                                   */ 
    pthread_testcancel(); 
    if (i == 5) { 
      printf("Cancel state set to ENABLE/n"); 
      rc = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&oldState); 
      checkResults("pthread_setcancelstate(2)/n", rc); 
      /* Now, cancellation points will allow pending cancels 
         to get through to this thread */ 
    } 
  } /* infinite */ 
  pthread_cleanup_pop(0); 
  return NULL; 
} 
 
int main(int argc, char **argv) 
{ 
  pthread_t             thread; 
  int                   rc=0; 
  void                 *status=NULL; 
 
  printf("Enter Testcase - %s/n", argv[0]); 
 
  /* Create a thread using default attributes */ 
  printf("Create thread using the NULL attributes/n"); 
  rc = pthread_create(&thread, NULL, threadfunc, NULL); 
  checkResults("pthread_create(NULL)/n", rc); 
 
  sleep(1); 
  printf("Cancel the thread/n"); 
  rc = pthread_cancel(thread); 
  checkResults("pthread_cancel()/n", rc); 
 
  rc = pthread_join(thread, &status); 
  if (status != PTHREAD_CANCELED) { 
    printf("Thread returned unexpected result!/n"); 
    exit(1); 
  } 
  printf("Main completed/n"); 
  return 0; 
} 


Output:


Enter Testcase - QP0WTEST/TPTESTC0
Create thread using the NULL attributes
Entered secondary thread
Cancel the thread
Secondary thread is now looping
Secondary thread is now looping
Secondary thread is now looping
Secondary thread is now looping
Secondary thread is now looping
Cancel state set to ENABLE
Secondary thread is now looping
Inside cancellation cleanup handler
Main completed
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值