pthread_mutex_timedlock 子例程

用途

锁定互斥对象 (ADVANCED REALTIME)。

语法

#include <pthread.h>
#include <time.h>

int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex,
       const struct timespec *restrict abs_timeout); 

描述

pthread_mutex_timedlock () 函数锁定互斥对象引用的互斥对象。 如果互斥对象已锁定,那么调用线程将阻塞,直到互斥对象变为可用为止,如 pthread_mutex_lock () 函数中所示。 如果在不等待另一个线程解锁互斥对象的情况下无法锁定互斥对象,那么此等待将在指定超时到期时终止。

abs_timeout 指定的绝对时间经过时 (以超时所基于的时钟 (即,当该时钟的值等于或超过 abs_timeout时)) ,或者在调用时已经过 abs_timeout 指定的绝对时间时,超时将到期。

如果支持 Timers 选项,那么超时基于 CLOCK_REALTIME 时钟; 如果不支持 Timers 选项,那么超时基于 time () 函数返回的系统时钟。

超时的分辨率与它所基于的时钟的分辨率相匹配。 蒂梅斯佩克 数据类型在 <time.h> 头中定义。

如果可以立即锁定互斥对象,那么该函数永不会因超时而失败。 如果可以立即锁定互斥对象,那么不需要检查 abs_timeout 参数的有效性。

由于优先级继承规则 (对于使用 PRIO_INHERIT 协议初始化的互斥对象) ,如果由于超时到期而终止了定时互斥等待,那么互斥对象的所有者的优先级会根据需要进行调整,以反映此线程不再存在于等待互斥对象的线程中。

如果互斥对象是健壮互斥对象,并且拥有健壮互斥对象的线程在持有互斥对象锁时终止,那么对 pthread_mutex_timedlock 子例程的调用将返回 EOWNERDEAD 错误代码。 在这种情况下,强健互斥被线程锁定,强健互斥的保护状态被标记为不一致。 对 pthread_mutex_consistent 子例程的调用可用于将稳健互斥对象的受保护状态标记为一致。

如果互斥对象是健壮互斥对象,并且健壮互斥对象的受保护状态不一致,那么对 pthread_mutex_unlock 子例程的调用会将健壮互斥对象的受保护状态标记为永久不可用。 在这种情况下,对 pthread_mutex_destroy 子例程的调用是对健壮互斥的唯一允许操作。

应用程序使用情况

pthread_mutex_timedlock () 函数是 线程超时 选项的一部分,不需要在所有实现上提供。

返回值

如果成功,那么 pthread_mutex_timedlock 子例程将返回 0; 否则,将返回错误号以指示错误。

错误代码

由于下列其中一个错误, pthread_mutex_timedlock 子例程可能失败:

描述
EDEADLK 当前线程已拥有互斥对象。
EINVAL 互斥对象是使用值为 PTHREAD_PRIO_PROTECT 的协议属性创建的,调用线程的优先级高于互斥对象的当前优先级上限。
EINVAL 进程或线程将被阻塞,并且 abs_timeout 参数指定了小于 0 或大于或等于 1000 万的纳秒字段值。
EINVAL abs_timeout 是一个 NULL 指针。
EINVAL mutex 指定的值未引用已初始化的互斥对象。
ETIMEDOUT 在指定的超时到期之前,无法锁定互斥对象。
无法恢复 无法恢复互斥对象的受保护状态。
EOWNERDEAD 互斥对象是一个坚固的互斥对象,拥有互斥对象的线程的进程在持有互斥对象锁时终止。

此函数不会返回 EINTR 错误代码。