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加锁。

原文地址:https://www.cnblogs.com/clnchanpin/p/6877117.html