pthread_mutex_lock , pthread_mutex_trylock 或 pthread_mutex_unlock 子例程
用途
锁定并解锁互斥对象。
库
线程库libpthreads.a
语法
描述
通过调用pthread_mutex_lock,mutex参数引用的互斥对象被锁定。 如果互斥对象已锁定,那么调用线程将阻塞,直到互斥对象变为可用为止。 此操作返回时,"储能器参数引用的互斥对象处于锁定状态,调用线程是其所有者。
如果互斥对象类型为 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_trylock与pthread_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_lock和pthread_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_lock、pthread_mutex_trylock和pthread_mutex_unlock函数将失效:
| 项 | 描述 |
|---|---|
| EINVAL | mutex参数指定的值不是初始化的 mutex 对象。 |
如果出现以下情况,pthread_mutex_lock函数将失效:
| 项 | 描述 |
|---|---|
| EDEADLK | 当前线程已拥有互斥对象,互斥对象类型为 PTHREAD_MUTEX_ERRORCHECK。 |
如果返回以下错误代码,则pthread_mutex_unlock()子例程失败:
| 项 | 描述 |
|---|---|
| EPERM | 当前线程不拥有互斥对象,互斥对象的类型不是 PTHREAD_MUTEX_NORMAL 或互斥对象是健壮互斥对象。 |
| 项 | 描述 |
|---|---|
| ENOTRECOVERABLE | 无法恢复互斥对象的受保护状态。 |
| EOWNERDEAD | 互斥对象是一个坚固的互斥对象,拥有互斥对象的线程的进程在持有互斥对象锁时终止。 |
这些子程序不会返回EINTR错误代码。