pthread_setcancelstate函数用法详解
pthread_setcancelstate函数简介
- 头文件包含
#include <pthread.h>
- 函数定义
int pthread_setcancelstate(int state , int * oldstate );
int pthread_setcanceltype(int type , int * oldtype );
- 编译链接选项
-pthread
pthread_setcancelstate函数常见使用错误
- 链接错误
undefined reference to `pthread_setcancelstate'
解决办法:添加链接选项
-pthread
- 编译错误
warning: implicit declaration of function ‘pthread_setcancelstate’ [-Wimplicit-function-declaration]
解决办法:包含头文件
#include <pthread.h>
pthread_setcancelstate函数详细描述
pthread_setcancelstate ()将调用线程的可取消性状态设置为state 中给出的值。线程以前的可取消性状态返回到oldstate 所指向的缓冲区中。state参数必须具有以下值之一:
- PTHREAD_CANCEL_ENABLE 该线程是可取消的。这是所有新线程(包括初始线程)中的默认可取消性状态。线程的可取消性类型确定可取消线程何时响应取消请求。
- PTHREAD_CANCEL_DISABLE 该线程不可取消。如果接收到取消请求,则会阻止该请求,直到启用可取消性为止。
pthread_setcanceltype ()将调用线程的可取消性类型设置为type 中给出的值。线程以前的可取消性类型返回到oldtype 所指向的缓冲区中。type参数必须具有以下值之一:
- PTHREAD_CANCEL_DEFERRED 取消请求被推迟到线程下一次调用作为取消点的函数(请参见pthreads (7))这是所有新线程(包括初始线程)中的默认可取消性类型。.ip即使有延迟取消,异步信号处理程序中的取消点仍可能被操作,其效果就像是异步取消一样。
- PTHREAD_CANCEL_ASYNCHRONOUS 线程可以随时取消。(通常,在收到取消请求时会立即取消,但系统不保证这一点。)
对于调用相同函数的进程中的其他线程来说,这些函数中的每个函数执行的set-and-get操作都是原子操作。
pthread_setcancelstate函数返回值
如果成功,这些函数返回0;错误时,它们返回一个非零错误号。
pthread_setcancelstate函数错误码
pthread_setcancelstate ()可能会失败,出现以下错误:
- EINVAL 对state 无效的值
pthread_setcanceltype ()可能会失败,出现以下错误:
- EINVAL 对type 无效的值
pthread_setcancelstate函数其他说明
有关取消线程时会发生什么的详细信息,请参阅pthread_cancel (3)
简而言之,如果线程执行某些不能被取消请求中断的关键操作,禁用可取消性非常有用。小心长时间禁用可取消性,或者在可能长时间阻塞的操作周围禁用可取消性,因为这将使线程对取消请求不响应。将可取消性类型设置为 PTHREAD_CANCEL_ASYNCHRONOUS 很少有用。由于线程可以在any时被取消,因此它不能安全地保留资源(例如,用malloc (3))获取互斥量、信号量或锁等分配内存)。保留资源是不安全的,因为当线程被取消时,应用程序无法知道这些资源的状态;也就是说,取消是发生在资源被保留之前,还是在资源被保留期间,还是在资源被释放之后?此外,如果取消发生在函数调用的中间,一些内部数据结构(例如,由malloc (3)函数族管理的空闲块的链表)可能处于不一致的状态。因此,清理处理程序不再有用。
可以安全地异步取消的函数称为"async-cancel-safe functions" 、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_setcancelstate函数使用举例
参见pthread_cancel (3)
评论区