当前位置:嗨网首页>书籍在线阅读

03-取消状态及类型

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

32.2 取消状态及类型

函数pthread_setcancelstate()和pthread_setcanceltype()会设定标志,允许线程对取消请求的响应过程加以控制。

844.png 函数pthread_setcancelstate()会将调用线程的取消性状态置为参数state所给定的值。该参数的值如下。

PTHREAD_CANCEL_DISABLE

线程不可取消。如果此类线程收到取消请求,则会将请求挂起,直至将线程的取消状态置为启用。

PTHREAD_CANCEL_ENABLE

线程可以取消。这是新建线程取消性状态的默认值。

线程的前一取消性状态将返回至参数oldstate所指向的位置。

如果对前一状态没有兴趣,Linux允许将oldstate置为NULL。在很多其他的系统实现中,情况也是如此。不过,SUSv3并没有规范这一特性,所以要保证应用的可移植性,就不能依赖这一特性。应该总是为oldstate设置一个非NULL的值。

如果线程执行的代码片段需要不间断地一气呵成,那么临时屏闭线程的取消性状态(PTHREAD_CANCEL_DISABLE)就变得很有必要。

如果线程的取消性状态为“启用”(PTHREAD_CANCEL_ENABLE),那么对取消请求的处理则取决于线程的取消性类型,该类型可以通过调用函数pthread_setcanceltype()时的参数type给定。参数type有如下值:

PTHREAD_CANCEL_ASYNCHRONOUS

可能会在任何时点(也许是立即取消,但不一定)取消线程。异步取消的应用场景很少,将延后至32.6节再做讨论。

PTHREAD_CANCEL_DEFERED

取消请求保持挂起状态,直至到达取消点(cancellation point,见下节)。这也是新建线程的缺省类型。后续各节将介绍延迟取消(deferred cancelability)的更多细节。

线程原有的取消类型将返回至参数oldtype所指向的位置。

与函数pthread_setcancelstate()的参数oldstate类似,如果不关心原有取消类型,许多系统实现(包括Linux)允许将oldtype置为NULL。同样,SUSv3也没有规范这一行为,所以需要保障可移植性的应用不应使用这一特性,应该总是为oldtype设置一个非NULL值。

当某线程调用fork()时,子进程会继承调用线程的取消性类型及状态。而当某线程调用exec()时,会将新程序主线程的取消性类型及状态分别重置为PTHREAD_CANCEL_NABLE和PTHREAD_CANCEL_DEFERRED。