【C】——pthread_mutex_lock

函数名

pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock - lock and unlock a mutex

 SYNOPSIS

概要

#include <pthread.h>

int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);

描述

pthread_mutex_lock() 函数锁住由mutex 指定的mutex  对象。如果mutex 已经被锁住,调用这个函数的线程阻塞直到mutex 可用为止。这跟函数返回的时候参数mutex 指定的mutex 对象变成锁住状态,同时该函数的调用线程成为该mutex 对象的拥有者。
如果mutex  对象的type 是 PTHREAD_MUTEX_NORMAL ,不进行deadlock detection( 死锁检测) 。企图进行relock  这个mutex 会导致deadlock.  如果一个线程对未加锁的或已经unlock mutex 对象进行unlock 操作,结果是不未知的。
如果mutex 类型是 PTHREAD_MUTEX_ERRORCHECK ,那么将进行错误检查。如果一个线程企图对一个已经锁住的mutex 进行relock ,将返回一个错误。如果一个线程对未加锁的或已经unlock mutex 对象进行unlock 操作,将返回一个错误。
如果mutex 类型是 PTHREAD_MUTEX_RECURSIVE mutex 会有一个锁住次数(lock count )的概念。当一个线程成功地第一次锁住一个mutex 的时候,锁住次数(lock count )被设置为1 ,每一次一个线程unlock 这个mutex 的时候,锁住次数(lock count )就减1 。当锁住次数(lock count )减少为0 的时候,其他线程就能获得该mutex 锁了。如果一个线程对未加锁的或已经unlock mutex 对象进行unlock 操作,将返回一个错误。
如果mutex 类型是 PTHREAD_MUTEX_DEFAULT ,企图递归的获取这个mutex 的锁的结果是不确定的。unlock 一个不是被调用线程锁住的mutex 的结果也是不确定的。企图unlock 一个未被锁住的mutex 导致不确定的结果。
pthread_mutex_trylock() 调用在参数 mutex 指定的 mutex 对象当前被锁住的时候立即返回,除此之外, pthread_mutex_trylock() pthread_mutex_lock() 功能完全一样。
The  pthread_mutex_unlock() 函数释放有参数 mutex 指定的 mutex 对象的锁。如果被释放取决于该 Mutex 对象的类型属性。如果有多个线程为了获得该 mutex 锁阻塞,调用 pthread_mutex_unlock() 将是该 mutex 可用,一定的调度策略将被用来决定哪个线程可以获得该 mutex 锁。(在 mutex 类型为 PTHREAD_MUTEX_RECURSIVE  的情况下,只有当 lock count  减为 0 并且调用线程在该 mutex 上已经没有锁的时候)(翻译到这里,才觉得我的这个锁概念是多么模糊)
如果一个线程在等待一个mutex 锁得时候收到了一个signal, 那么在从signal handler 返回的时候,该线程继续等待该mutex 锁,就像这个线程没有被中断一样。
返回值
成功, pthread_mutex_lock()  和  pthread_mutex_unlock()  返回0 ,否则返回一个错误的提示码
pthread_mutex_trylock()  在成功获得了一个mutex 的锁后返回0 ,否则返回一个错误提示码

错误

pthread_mutex_lock()  和  pthread_mutex_unlock() 失败的时候
[EINVAL]
mutex 在生成的时候,它的protocol 属性的值是 PTHREAD_PRIO_PROTECT ,同时调用线程的优先级(priority) 比该mutex 的当前prority 上限高
pthread_mutex_trylock()  函数在一下情况会失败:
[EBUSY]
The  mutex could not be acquired because it was already locked.
mutex 已经被锁住的时候无法再获取锁
The  pthread_mutex_lock()pthread_mutex_trylock() and  pthread_mutex_unlock() functions may fail if:
[EINVAL]
mutex 指向的mutex 未被初始化
[EAGAIN]
Mutex lock count( 锁数量) 已经超过 递归索的最大值,无法再获得该mutex
pthread_mutex_lock()  函数在一下情况下会失败:
[EDEADLK]
当前线程已经获得该mutex
pthread_mutex_unlock()  函数在以下情况下会失败:
[EPERM]
当前线程不是该mutex 锁的拥有者
所有的这些函数的错误返回值都不会是[EINTR]

你可能感兴趣的:(pthread)