互斥量是信号灯的特殊形式。
mutex: mut表示相互(mutual) ,ex表示排斥(exclusion)。
1.互斥量的初始化
静态初始化
pthread_mutex_t _mutex
=
PTHREAD_MUTEX_INITIALIZER
动态初始化
int
pthread_mutex_init(phtread_mutex_t
*
mutex, phtread_mutexattr_t
*
attr)
返回值
0:成功
其他:错误编号
2.互斥量销毁
int
pthread_mutex_destroy(pthread_mutex_t
*
mutex)
返回值
0:成功
其他:错误编号
3.加锁
int
pthread_mutex_lock(pthread_mutex_t
*
mutex)
int pthread_mutex_trylock(pthread_mutex_t * mutex)
int pthread_mutex_trylock(pthread_mutex_t * mutex)
对已加锁的锁trylock返回EBUSY,反之则加锁并返回0
4.解锁
int
pthread_mutex_unlock(pthred_mutex_t
*
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导致不确定的结果。
5.对锁变量属性的操作:
get函数用来查询pthread_mutexattr_t结构的进程共享属性
set函数用来修改该属性。
以上两个函数都是成功返回0,失败返回错误编号。
以上两个函数用来修改互斥量类型属性,从字面意思就知道是干啥了,这里就不多解释了。
返回值还是成功返回0,失败返回错误编号。
int
pthread_mutexattr_getpshared(
const
pthread_mutexattr_t
*
attr,
int
*
pshared);
int pthread_mutexattr_setpshared(pthread_mutexattr_t * attr, int pshared);
int pthread_mutexattr_setpshared(pthread_mutexattr_t * attr, int pshared);
set函数用来修改该属性。
以上两个函数都是成功返回0,失败返回错误编号。
int
pthread_mutexattr_gettype(
const
pthread_mutexattr_t
*
attr,
int
*
type)
int pthread_mutexattr_settype(pthread_mutextattr_t * attr, int type)
int pthread_mutexattr_settype(pthread_mutextattr_t * attr, int type)
返回值还是成功返回0,失败返回错误编号。