pthread_cond_t和pthread_mutex_t的疑问?
虽然看了些资料,但是还是不懂pthread_cond_t前面为什么要加一个pthread_mutex_t?
还有加锁后什么时候解锁呢?
如: pthread_mutex_t mutex;
pthread_cond_t cond_t;
pthread_mutex_lock(&mutex);
pthread_wait_cond(&cond_t, &mutex);
......//这里可以立即解锁码? 为什么有些时候还锁住了其他代码?如何判断该锁住哪些变量呢?
pthread_mutex_unlock(&mutex);
虚心求教。
还有这里,说pthread_wait_cond()在未触发前会解锁,触发后会加锁,那前面的 pthread_mutex_loac()就可以不要了啊?直接wait加锁后解锁就可以了啊?
------解决方案--------------------楼主的用法不对,一般的用法如下,看完就好理解了
pthread_mutex_lock(&mutex);
while(sth != 1)
{
pthread_wait_cond(&cond_t, &mutex);
}
......//这里可以立即解锁码? 为什么有些时候还锁住了其他代码?如何判断该锁住哪些变量呢?
pthread_mutex_unlock(&mutex);
1.虽然看了些资料,但是还是不懂pthread_cond_t前面为什么要加一个pthread_mutex_t?
这个没看懂- -!! pthread_cond_t和pthread_mutex_t 是数据类型
2.还有加锁后什么时候解锁呢?
......//这里可以立即解锁码? 为什么有些时候还锁住了其他代码?如何判断该锁住哪些变量呢?
这两个问题说明楼主对操作系统的P,V操作没有吃透,建议回头补一下
3.pthread_wait_cond()在未触发前会解锁,触发后会加锁,那前面的 pthread_mutex_loac()就可以不要了啊?直接wait加锁后解锁就可以了啊?
不可以不要,linux说明中有,在锁没有lock之前就unlock锁的话,锁的行为是未定义的,就是说你unlock一个没有lock的锁,操作系统没有定义会发生什么行为
------解决方案--------------------互斥锁是为了访问共享变量时候的线程安全,条件变量是为了避免轮询耗费CPU,互斥锁+条件变量一起工作是为了原子的挂起与原子的唤醒。
------解决方案--------------------看资料是没救的,建议系统的学习UNIX环境高级编程+UNIX网络编程。
------解决方案--------------------
pthread_wait_cond的用法要清楚,未触发前会执行解锁操作,并不会执行什么加锁操作,所以之前需要有pthread_mutex_lock() ,加锁操作是在触发后执行。
正确用法是
pthread_mutex_lock()
while(条件)
pthread_cond_wait();
/*code*/
pthread_mutex_unlock()
第一个加锁 是为了while条件判断时,条件不会被其他线程突然修改。
条件不成立时,pthread_cond_wait休眠且释放锁,等待触发条件,这时的释放锁 跟 while前的加锁匹配
当条件触发时,pthread_cond_wait返回,且执行加锁操作,然后执行while条件判断,这里加锁也是为了while条件不被修改,简称 原子操作。判断若通过,则继续执行下面的code,然后解锁。这里的解锁跟 pthread_cond_wait执行 的加锁匹配。
UNIX环境高级编程和unix网络编程 卷2 有详细讲解,也是学习Linux的基础。