1、互斥量的几个常用函数:
#include <pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t
*mutexattr);
int pthread_mutex_lock(pthread_mutex_t *mutex));
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
【注:以下是在Red Hat下进行验证得到的结果】
Questions:
1、如果连续unlock某个互斥量,会发生什么?第一次之后的 pthread_mutex_unlock()返回什么值?
自己验证得到结果:
如果mutex的属性为默认属性,即:
int res = 0;
pthread_mutex_t a_thread;
res = pthread_mutex_init(&a_thread,NULL);
那么第一次之后的 pthread_mutex_unlock()还是会返回成功值0,不会返回错误码。但是会影响到 pthread_mutex_destroy()函数, pthread_mutex_destroy()执行失败。
如果mutex的属性为PTHREAD_MUTEX_ERRORCHECK_NP,
那么第一次之后的 pthread_mutex_unlock()返回错误码1,不过随后的 pthread_mutex_destroy()函数能够执行成功,返回0。
理论指导:
具体的结果实际上与mutex变量的属性有关。如下:
如 果mutex 对象的type是 PTHREAD_MUTEX_NORMAL_NP,不进行deadlock detection(死锁检测)。企图进行relock 这个mutex会导致deadlock. 如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,结果是不未知的。
如 果mutex类型是 PTHREAD_MUTEX_ERRORCHECK_NP,那么将进行错误检查。如果一个线程企图对一个已经锁住的mutex进行relock,将返回一个错 误。如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,将返回一个错误。
如 果mutex类型是 PTHREAD_MUTEX_RECURSIVE_NP,mutex会有一个锁住次数(lock count)的概念。当一个线程成功地第一次锁住一个mutex的时候,锁住次数(lock count)被设置为1,每一次一个线程unlock这个mutex的时候,锁住次数(lock count)就减1。当锁住次数(lock count)减少为0的时候,其他线程就能获得该mutex锁了。如果一个线程对未加锁的或已经unlock的mutex对象进行unlock操作,将返 回一个错误。
如果mutex类型是 PTHREAD_MUTEX_DEFAULT_NP,企图递归的获取这个mutex的锁的结果是不确定的。unlock一个不是被调用线程锁住的mutex的结果也是不确定的。企图unlock一个未被锁住的mutex导致不确定的结果。
pthread_mutex_unlock()函数释放有参数mutex指定的mutex对象的锁。如何被释放取决于该Mutex对象的类型属性。如果有多个线程为了获得该mutex锁阻塞,调用pthread_mutex_unlock()将使该mutex可用,一定的调度策略将被用来决定哪个线程可以获得该mutex锁。(在mutex类型为PTHREAD_MUTEX_RECURSIVE_NP 的情况下,只有当lock count 减为0并且调用线程在该mutex上已经没有锁的时候)
另外:当设置类型为 PTHREAD_MUTEX_ERRORCHECK时,提示 PTHREAD_MUTEX_ERRORCHECK未声明。还不知为何。。