论坛风格切换
您好,欢迎光临本站!   登录 注册新用户
  • 3104阅读
  • 4回复

[C/C++][新手总结]多线程编程之互斥量 mutex(持续更新) [复制链接]

上一主题 下一主题
 
发帖
1
黑豆
5
威望
5
贡献值
0
交易币
0
红豆
0
只看楼主 倒序阅读 0 发表于: 2014-12-28
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未声明。还不知为何。。




发帖
2
黑豆
1
威望
2
贡献值
0
交易币
0
红豆
0
只看该作者 2 发表于: 2015-03-19
谢谢分享,支持一下。
发帖
2
黑豆
1
威望
2
贡献值
0
交易币
0
红豆
0
只看该作者 3 发表于: 2015-03-19
具体的结果实际上与mutex变量的属性有关。如下:
发帖
6
黑豆
6
威望
6
贡献值
0
交易币
0
红豆
0
只看该作者 4 发表于: 2015-04-07
操作系统实验做过互锁,和信号灯差不多,不过感觉信号灯更好用
快速回复
限100 字节
 
上一个 下一个