多线程编程指南

使用非阻塞互斥锁锁定

使用 pthread_mutex_trylock(3C) 可以尝试锁定 mutex 所指向的互斥锁。对于 Solaris 线程,请参见mutex_trylock 语法

pthread_mutex_trylock 语法

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 返回值

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

描述:

已经超出了可同时持有的互斥锁数目的限制。