PTHREAD_SETCANCELSTATE - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
pthread_setcancelstate,pthread_setcanceltype-设置可取消状态和类型
语法
#include <pthread.h> int pthread_setcancelstate(int state, int *oldstate); int pthread_setcanceltype(int type, int *oldtype); Compile and link with -pthread.
说明
pthread_setcancelstate()将调用线程的可取消状态设置为state中给定的值。线程的先前可取消状态在oldstate指向的缓冲区中返回。 state参数必须具有以下值之一:
- PTHREAD_CANCEL_ENABLE
- 该线程是可取消的。这是所有新线程(包括初始线程)的默认可取消状态。线程的可取消类型确定可取消线程何时响应取消请求。
- PTHREAD_CANCEL_DISABLE
- 该线程不可取消。如果收到取消请求,它将被阻止,直到启用取消功能为止。
pthread_setcanceltype()将调用线程的可取消类型设置为type中给定的值。线程的先前取消类型在由oldtype指向的缓冲区中返回。 type参数必须具有以下值之一:
- PTHREAD_CANCEL_DEFERRED
- 取消请求被延迟,直到线程接下来调用作为取消点的函数为止(请参阅pthreads(7))。这是所有新线程(包括初始线程)中的默认取消类型。
- 即使使用了延迟取消,异步信号处理程序中的取消点仍然可以作用,其效果就好像是异步取消一样。
- PTHREAD_CANCEL_ASYNCHRONOUS
- 该线程可以随时取消。 (通常,它将在收到取消请求后立即被取消,但是系统不对此进行保证。)
对于调用同一函数的进程中的其他线程,这些函数中的每个函数执行的设置和获取操作都是原子的。
返回值
成功时,这些函数返回0;否则,返回0。错误时,它们返回非零错误号。
错误说明
pthread_setcancelstate()可能因以下错误而失败:
- EINVAL
- 状态无效的值。
pthread_setcanceltype()可能因以下错误而失败:
- EINVAL
- 类型的值无效。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
pthread_setcancelstate(),pthread_setcanceltype() | Thread safety | MT-Safe |
pthread_setcancelstate(),pthread_setcanceltype() | Async-cancel-safety | AC-Safe |
遵循规范
POSIX.1-2001,POSIX.1-2008。
备注
有关取消线程时发生的情况的详细信息,请参见pthread_cancel(3)。
如果线程执行某些不能被取消请求中断的关键操作,则短暂禁用可取消性很有用。提防长时间禁用可取消性,或禁用可能长时间阻止的操作,因为这会使线程对取消请求无响应。
Asynchronous cancelability
将取消类型设置为PTHREAD_CANCEL_ASYNCHRONOUS很少有用。由于可以随时取消线程,因此无法安全地保留资源(例如,使用malloc(3)分配内存),获取互斥量,信号量或锁等等。保留资源是不安全的,因为当线程被取消时,应用程序无法知道这些资源的状态。也就是说,取消是在资源预留之前,预留期间还是在释放之后发生的?此外,如果在函数调用的中间发生取消,则某些内部数据结构(例如,由malloc(3)系列函数管理的空闲块的链表)可能会处于不一致状态。因此,清理处理程序不再有用。
可以安全地异步取消的功能称为异步取消安全功能。 POSIX.1-2001和POSIX.1-2008仅要求pthread_cancel(3),pthread_setcancelstate()和pthread_setcanceltype()是异步取消安全的。通常,不能从异步可取消线程安全地调用其他库函数。
异步可取消性很有用的几种情况之一是取消纯计算绑定循环中的线程。
Portability notes
Linux线程实现允许pthread_setcancelstate()的oldstate参数为NULL,在这种情况下,有关先前可取消状态的信息不会返回给调用方。许多其他实现也允许使用NULL oldstat参数,但是POSIX.1没有指定这一点,因此可移植应用程序应始终在oldstate中指定非NULL值。一组精确相似的语句适用于pthread_setcanceltype()的oldtype参数。
示例
请参见pthread_cancel(3)。
另外参见
pthread_cancel(3),pthread_cleanup_push(3),pthread_testcancel(3),pthreads(7)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。