pthread_mutexattr_getprotocol 或 pthread_mutexattr_setprotocol 子例程

用途

获取并设置互斥属性对象的协议属性。

语法

#include <pthread.h>

int pthread_mutexattr_getprotocol(const pthread_mutexattr_t *
       restrict attr, int *restrict protocol);
int pthread_mutexattr_setprotocol(pthread_mutexattr_t *attr,
       int protocol); 

描述

pthread_mutexattr_getprotocol 子例程和 pthread_mutexattr_setprotocol 子例程获取并设置由 attr 参数 (先前由 pthread_mutexattr_init 子例程创建) 指向的互斥属性对象的 protocol 参数。

protocol 属性定义在利用互斥对象时要遵循的协议。 protocol 参数的值可以是下列其中一项,在 pthread.h 头文件中定义:
  • PTHREAD_PRIO_NONE
  • PTHREAD_PRIO_INHERIT
  • PTHREAD_PRIO_PROTECT

当线程拥有具有 PTHREAD_PRIO_NONE 协议属性的互斥对象时,其优先级和调度不受其互斥对象所有权的影响。

当线程由于拥有一个或多个具有 PTHREAD_PRIO_INHERIT 协议属性的互斥对象而阻塞更高优先级的线程时,它将以更高的优先级或等待此线程拥有的任何互斥对象并使用此协议初始化的最高优先级线程的优先级执行。

当线程拥有一个或多个使用 PTHREAD_PRIO_PROTECT 协议初始化的互斥对象时,无论其他线程是否被阻止在这些互斥对象中的任何一个上,它都将以该线程拥有的所有互斥对象的更高优先级或最高优先级上限执行。 当互斥优先级上限比当前线程优先级更受青睐并且必须更改线程优先级时,需要特权检查。 pthread_mutex_lock 子例程不会因为不适当的特权而失败。 在这种情况下,锁定成功,但不会执行任何提升。

当线程持有已使用 PTHREAD_PRIO_INHERITPTHREAD_PRIO_PROTECT 协议属性初始化的互斥对象时,在其原始优先级发生更改 (例如通过调用 sched_setparam 子例程) 的情况下,它不会被移动到其优先级处的调度队列尾部。 同样,当线程解锁已使用 PTHREAD_PRIO_INHERITPTHREAD_PRIO_PROTECT 协议属性初始化的互斥对象时,在其原始优先级发生更改的情况下,不会将其移至其优先级处的调度队列尾部。

如果线程同时拥有多个使用不同协议初始化的互斥对象,那么它将以每个协议所获得的最高优先级执行。

当线程对 pthread_mutex_lock 子例程进行调用时,使用值为 PTHREAD_PRIO_INHERIT的协议属性初始化互斥对象,当由于互斥对象由另一个线程拥有而阻塞调用线程时,该所有者线程只要继续拥有互斥对象,就会继承调用线程的优先级。 实现会将其执行优先级更新为其分配的最大优先级及其所有继承的优先级。 此外,如果此所有者线程本身在另一个互斥对象上被阻塞,那么将以递归方式将相同的优先级继承效应传播到此另一个所有者线程。

返回值

成功完成时, pthread_mutexattr_getprotocol 子例程和 pthread_mutexattr_setprotocol 子例程将返回零; 否则,将返回错误号以指示错误。

错误代码

pthread_mutexattr_setprotocol 子例程在下列情况下失败:
描述
ENOTSUP protocol 参数指定的值是不受支持的值。
在下列情况下, pthread_mutexattr_getprotocol 子例程和 pthread_mutexattr_setprotocol 子例程可能会失败:
描述
EINVAL attr 参数或 protocol 参数指定的值无效。
ENOSYS 此功能不受支持 (草稿 7)。
ENOTSUP 此功能与 checkpoint/restart 一起不受支持。
EPERM 调用者没有特权在严格符合环境变量 XPG_SUS_ENV=ON的标准的环境中执行操作。