zoukankan      html  css  js  c++  java
  • linuxc线程信号-pthread_cond_wait理解

    pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t*mutex)函数

    传入的參数mutex用于保护条件,由于我们在调用pthread_cond_wait时,假设条件不成立我们就进入堵塞。可是进入阻塞这个期间,假设条件变量改变了的话,那我们就漏掉了这个条件。由于这个线程还没有放到等待队列上。所以调用pthread_cond_wait前要先锁相互排斥量,

    即调用pthread_mutex_lock(),pthread_cond_wait在把线程放进堵塞队列后,自己主动对mutex进行解锁,使得

    其他线程能够获得加锁的权利。这样其他线程才干对临界资源进行訪问并在适当的时候唤醒这个堵塞的进程。

    当pthread_cond_wait返回的时候又自己主动给mutex加锁。
    实际上边代码的加解锁步骤例如以下:
    /************pthread_cond_wait()的用法**********/
    pthread_mutex_lock(&qlock);    /*lock*/
    pthread_cond_wait(&qready, &qlock); /*block-->unlock-->wait() return-->lock*/
    pthread_mutex_unlock(&qlock); /*unlock*/

    /*****************************************************/


    了解 pthread_cond_wait() 的作用很重要 -- 它是 POSIX 线程信号发送系统的核心,也是最难以理解的部分。

     

    首先,让我们考虑下面情况:线程为查看已链接列表而锁定了相互排斥对象,然而该列表恰巧是空的。这一特定线程什么也干不了 -- 其设计意图是从列表中除去节点,可是如今却没有节点。因此,它仅仅能: 

    锁定相互排斥对象时。线程将调用 pthread_cond_wait(&mycond,&mymutex)。

    pthread_cond_wait() 调用相当复杂,因此我们每次仅仅运行它的一个操作。

     

    pthread_cond_wait() 所做的第一件事就是同一时候对相互排斥对象解锁(于是其他线程能够改动已链接列表),并等待条件 signal 发生,当 pthread_cond_wait() 接收到还有一个线程的“信号”时,它将苏醒(此时还要等其他线程mutex解锁),苏醒前会先对mutex加锁。

  • 相关阅读:
    EL表达式格式化日期
    EL表达式格式化日期
    Jquery中find与each方法使用详解
    Jquery中find与each方法使用详解
    快递100接口使用
    快递100接口使用
    android 中context的具体作用和意义
    startactivityforresult使用
    android 获取sharedpreference的三种方法的区别
    关于contentprovider的几个问题
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6877117.html
Copyright © 2011-2022 走看看