函数原型:
int pthread_mutex_trylock(pthread_mutex_t *mutex);include <pthread.h>
pthread_mutex_t mutex;
int ret;
ret = pthread_mutex_trylock(&mutex); /* try to lock the mutex */
pthread_mutex_trylock() 是 pthread_mutex_lock() 的非阻塞版本。如果 mutex 所引用的互斥对象当前被任何线程(包括当前线程)锁定,则将立即返回该调用。否则,该互斥锁将处于锁定状态,调用线程是其属主。
返回值
pthread_mutex_trylock() 在成功完成之后会返回零。其他任何返回值都表示出现了错误。如果出现以下任一情况,该函数将失败并返回对应的值。
- EBUSY
描述:由于 mutex 所指向的互斥锁已锁定,因此无法获取该互斥锁。
- EAGAIN
描述:由于已超出了 mutex 的递归锁定最大次数,因此无法获取该互斥锁。如果定义了 _POSIX_THREAD_PRIO_INHERIT 符号,则会使用协议属性值 PTHREAD_PRIO_INHERIT 对互斥锁进行初始化。此外,如果 pthread_mutexattr_setrobust_np() 的 robustness 参数是 PTHREAD_MUTEX_ROBUST_NP,则该函数将失败并返回以下值之一:
EOWNERDEAD
描述:该互斥锁的最后一个属主在持有该互斥锁时失败。该互斥锁现在由调用方拥有。调用方必须尝试使该互斥锁所保护的状态一致。如果调用方能够使状态保持一致,请针对该互斥锁调用 pthread_mutex_consistent_np() 并解除锁定该互斥锁。以后对 pthread_mutex_lock() 的调用都将正常进行。如果调用方无法使状态保持一致,请勿针对该互斥锁调用 pthread_mutex_init() ,而要解除锁定该互斥锁。以后调用 pthread_mutex_trylock() 时将无法获取该互斥锁,并且将返回错误代码 ENOTRECOVERABLE。如果已获取该锁的属主失败并返回 EOWNERDEAD,则下一个属主获取该锁时返回 EOWNERDEAD。- ENOTRECOVERABLE
描述:尝试获取的互斥锁正在保护某个状态,此状态由于该互斥锁以前的属主在持有该锁时失败而导致不可恢复。尚未获取该互斥锁。 以下条件下可能会出现此情况:
- @ 以前获取该锁时返回 EOWNERDEAD
- @ 该属主无法清除此状态
- @ 该属主已经解除锁定了该互斥锁,但是没有使互斥锁状态保持一致
ENOMEM
描述:已经超出了可同时持有的互斥锁数目的限制。