当前位置:  技术问答>linux和unix

pthread_cond_t和pthread_mutex_t的疑问?

    来源: 互联网  发布时间:2017-02-22

    本文导语:  虽然看了些资料,但是还是不懂pthread_cond_t前面为什么要加一个pthread_mutex_t? 还有加锁后什么时候解锁呢?  如: pthread_mutex_t mutex;       pthread_cond_t cond_t;       pthread_mutex_lock(&mutex);       pthread_wait_cond(&co...

虽然看了些资料,但是还是不懂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_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的基础。


|
楼主的用法不对,一般的用法如下,看完就好理解了
  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网络编程。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在linux7.3下多个线程使用 pthread_cond_t 的一个小问题。


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3