12.7 Cancal选项


还有两个线程属性并没有包含在pthread_attr_t结构中,它们是cancelability state以及cancelability type。这两个属性影响了线程对于函数调用pthread_cancel的相应行为。(11.5节)
cancelability state属性可以取值PTHREAD_CANCEL_ENABLE或者是PTHREAD_CANCEL_DISABLE,线程可以调用函数pthread_setcancelstate修改其cancelbility state.

 
 
  1. #include <pthread.h>
  2. int pthread_setcancelstate(int state, int *oldstate);
  3. Return: 0 if OK, error number on failure.

该函数是一个原子操作,能够将当前的cancelability state设置为state,并将之前的cancelability state存储在oldstate指针所指位置。
在11.5节中提到,函数pthread_cancel并不会等待线程终止,在默认情况下,线程将会在canellation请求发出以后继续运行,直到线程到达一个cancellation point,所谓的cancellation point 是指会检查线程线程时候已经被取消了的地方,如果线程被取消了,那么就会相应请求,POSIX.1保证了cancellation point将会在线程调用如下函数的时候出现;
517957-20160702195010968-44829404.png
线程启动的时候,其cancelability state的默认值是PTHREAD_CANCEL_ENABLE,当state被设置成PTHREAD_CANCEL_DISABLE的时候,对于函数pthread_cancel的调用并不会终止线程,取而代之的是,cancellation请求将会一直处于挂起状态,当线程状态再一次被使能的时候,线程就会在接下来的cancellation point响应挂起状态的cancellation请求。
除了图12.14列出的函数之外,POSIX.1还指出,图12.15中列出的函数是可选的cancellation points.
517957-20160702195012109-470838554.png
517957-20160702195015140-813701806.png
517957-20160702195016327-1255373678.png
如果你的应用程序在很长一段时间内都没有调用图12.14以及图12.15中的函数的话,你可以调用函数pthread_testcancel来增加你自己的cancellation point到程序中。

 
 
  1. #include <pthread.h>
  2. void pthread_testcancel(void);

当你调用函数pthread_testcancel的时候,如果cancellation请求处于挂起状态,并且如果cancellation没有被不使能的话,线程就会被取消,当取消不使能的时候,函数pthread_testcancel并不会由任何影响。
我们已经描述的默认的cancellation type是deferred cancellation(延期取消),即是说,在调用函数pthread_cancel之后,实际的取消动作在线程到达cancellation point之前并不会出现,我们可以使用函数pthread_setcanceltype来修改取消类型.

 
 
  1. #include <pthread.h>
  2. int pthread_setcanceltype(int type, int *oldtype);
  3. Returns: 0 if OK, error number on failure.

可以设置的类型由两种,PTHREAD_CANCEL_DEFERRED或者是PTHREAD_CANCEL_ASYNCHRONOUS,并且返回之前的类型到指针所指的内存中。
异步取消与延期取消不同,异步取消可以在任意时间点取消,而不必等到cancellation point.





转载于:https://www.cnblogs.com/U201013687/p/5635942.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值