日期:2014-05-16  浏览次数:20695 次

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的基础。