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

关于 互斥和条件变量 的疑问

    来源: 互联网  发布时间:2016-07-16

    本文导语:   pthread_mutex_t count_lock;     pthread_cond_t count_nonzero;     unsigned count;     decrement_count() {       pthread_mutex_lock(&count_lock);       while(count == 0) {         pthread_cond_wait(&count_nonzero, &count_lock);//这里     ...

 pthread_mutex_t count_lock;
    pthread_cond_t count_nonzero;
    unsigned count;
    decrement_count() {
      pthread_mutex_lock(&count_lock);
      while(count == 0) {
        pthread_cond_wait(&count_nonzero, &count_lock);//这里
        count = count - 1;
      }
      pthread_mutex_unlock(&count_lock);
    }
    
    increment_count() {
       pthread_mutex_lock(&count_lock);
       if(count == 0) {
         pthread_cond_signal(&count_nonzero);
         count = count + 1;
       }
       pthread_mutex_unlock(&count_lock);
    }


pthread_mutex_lock(&count_lock);锁住了count_lock之后
pthread_cond_wait(&count_nonzero, &count_lock);有把自己阻塞了

请问increment_count() 的pthread_mutex_lock(&count_lock);是怎么通过的

|

|
DESCRIPTION
       The  pthread_cond_timedwait()  and pthread_cond_wait() functions shall block on a condition variable. They
       shall be called with mutex locked by the calling thread or undefined behavior results.

       These functions atomically release mutex and cause the calling thread to block on the  condition  variable
       cond; atomically here means "atomically with respect to access by another thread to the mutex and then the
       condition variable". That is, if another thread is able to acquire  the  mutex  after  the  about-to-block
       thread  has  released  it,  then a subsequent call to pthread_cond_broadcast() or pthread_cond_signal() in
       that thread shall behave as if it were issued after the about-to-block thread has blocked.

man 一下就知道了。

|


不对,pthread_cond_wait前要先锁互斥量,即调用pthread_mutex_lock(),pthread_cond_wait在把线程放进阻塞队列后,自动对mutex进行解锁,使得其它线程可以获得加锁的权利。这样其它线程才能对临界资源进行访问并在适当的时候唤醒这个阻塞的进程。当pthread_cond_wait返回的时候又自动给mutex加锁。


最后的
pthread_mutex_unlock(&count_lock);还是需要的!

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












  • 相关文章推荐
  • 互斥锁的一个问题
  • 在下面这段代码中,如果对init方法只加synchronized关键字,则不能达到互斥的目的,还要再加上static关键字才能互斥,为什么?
  • wince程序防止创建多个实例实现互斥作用
  • 信号量和互斥锁有什么区别??
  • linux进程同步或互斥
  • 进程对串口读写时使用互斥机制吗?
  • 在linux下,如何进行“互斥”和“并发”的控制?
  • 信号量可以用于多进程多线程同时互斥不?
  • 多线程调用ioctl 应在哪进行互斥操作?
  • 关于用文件实现进程互斥的问题
  • 问个多线程网络服务程序的文件操作符的互斥问题
  • 请教POSIX问题:一个进程中,可以有多个互斥锁麽?
  • 用户态能否实现信号量机制,来提供线程间互斥和同步的功能?
  • linux/unix里的进程互斥问题 ,有关lockf()函数!
  • 关于内核互斥体的问题
  • 互斥锁和信号量,能不能实现先阻塞先唤醒,顺序获取互斥锁和信号量
  • 信号量互斥问题
  • 关于文件读些互斥的问题
  • c语言实现程序互斥问题 急.....
  • 求助 程序中添加互斥锁代码后编译怎么通不过 ?


  • 站内导航:


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

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

    浙ICP备11055608号-3