pthread_mutex_lock , pthread_mutex_trylock 或 pthread_mutex_unlock 子例程

用途

锁定并解锁互斥对象。

线程库libpthreads.a

语法

#include <pthread.h>
int pthread_mutex_lock ( mutex)
pthread_mutex_t *mutex;
int pthread_mutex_trylock ( mutex)
pthread_mutex_t *mutex;
int pthread_mutex_unlock ( mutex)
pthread_mutex_t *mutex;

描述

通过调用pthread_mutex_lockmutex参数引用的互斥对象被锁定。 如果互斥对象已锁定,那么调用线程将阻塞,直到互斥对象变为可用为止。 此操作返回时,"储能器参数引用的互斥对象处于锁定状态,调用线程是其所有者。

如果互斥对象类型为 PTHREAD_MUTEX_NORMAL ,那么不会提供死锁检测。 尝试重新锁定互斥对象会导致死锁。 如果线程试图解锁未锁定的互斥项或已解锁的互斥项,就会产生未定义的行为。

如果互斥对象类型为 PTHREAD_MUTEX_ERRORCHECK ,那么将提供错误检查。 如果线程试图重新锁定已经锁定的互斥,则会返回错误信息。 如果线程试图解锁未锁定的互斥项或已解锁的互斥项,则会返回错误信息。

如果互斥对象类型为 PTHREAD_MUTEX_RECURSIVE ,那么互斥对象将保持锁定计数的概念。 当线程首次成功获取互斥对象时,锁定计数将设置为 1。 每次线程重新锁定此互斥对象时,锁定计数将递增 1。 每次线程解锁互斥对象时,锁定计数将由 1 递减。 当锁定计数达到零时,互斥对象变为可供其他线程获取。 如果线程试图解锁未锁定的互斥项或已解锁的互斥项,则会返回错误信息。

如果互斥对象类型为 PTHREAD_MUTEX_DEFAULT ,那么尝试以递归方式锁定互斥对象将导致未定义的行为。 如果互斥对象未被调用线程锁定,那么尝试将其解锁会导致未定义的行为。 如果未锁定互斥对象,那么尝试将其解锁会导致未定义的行为。

如果互斥是健壮互斥,并且健壮互斥的所有线程在持有互斥锁时终止,则调用pthread_mutex_lock子例程会返回EOWNERDEAD错误代码。 在这种情况下,强健互斥被线程锁定,强健互斥的保护状态被标记为不一致。 调用pthread_mutex_consistent子程序可以将健壮互斥器的保护状态标记为一致。

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

函数pthread_mutex_trylockpthread_mutex_lock相同,但如果mutex参数引用的健壮 mutex 对象当前被锁定(被任何线程锁定,包括当前线程),则调用立即返回。

pthread_mutex_unlock函数释放由 mutex 引用的互斥对象。 释放互斥对象的方式取决于互斥对象的类型属性。 If there are threads blocked on the mutex object referenced by the 储能器 parameter when pthread_mutex_unlock is called, resulting in the mutex becoming available, the scheduling policy is used to determine which thread will acquire the mutex. (对于 PTHREAD_MUTEX_RECURSIVE 互斥对象,当计数达到零并且调用线程不再对此互斥对象有任何锁定时,互斥对象将变为可用)。

如果将信号传递到等待互斥对象的线程,那么当从信号处理程序返回时,线程将恢复等待互斥对象,就好像未中断一样。

参数

描述
mutex 指定要锁定的互斥对象。

返回值

如果成功,pthread_mutex_lockpthread_mutex_unlock函数返回 0。 否则,将返回错误号以指示错误。

The function pthread_mutex_trylock returns zero if a lock on the mutex object referenced by the 储能器 parameter is acquired. 否则,将返回错误号以指示错误。

错误代码

如果出现以下情况,pthread_mutex_trylock函数将失效:

描述
EBUSY 无法获取互斥项,因为它已被锁定。

如果出现以下情况,pthread_mutex_lockpthread_mutex_trylockpthread_mutex_unlock函数将失效:

描述
EINVAL mutex参数指定的值不是初始化的 mutex 对象。

如果出现以下情况,pthread_mutex_lock函数将失效:

描述
EDEADLK 当前线程已拥有互斥对象,互斥对象类型为 PTHREAD_MUTEX_ERRORCHECK。

如果返回以下错误代码,则pthread_mutex_unlock()子例程失败:

描述
EPERM 当前线程不拥有互斥对象,互斥对象的类型不是 PTHREAD_MUTEX_NORMAL 或互斥对象是健壮互斥对象。
如果返回以下错误代码,则pthread_mutex_lock子例程或pthread_mutex_trylock子例程失败:
描述
ENOTRECOVERABLE 无法恢复互斥对象的受保护状态。
EOWNERDEAD 互斥对象是一个坚固的互斥对象,拥有互斥对象的线程的进程在持有互斥对象锁时终止。

这些子程序不会返回EINTR错误代码。