Pthreads条件变量

    条件变量的定义:条件变量是一个数据对象,允许线程在某个特定条件或事件发生前都处于挂起状态。因此在Pthreads程序中至少有两个对象,一个在条件满足或事件发生时发送信号,另一个等待信号。发送对象的操作流程通常如下:(1)对互斥量上锁;(2)操作谓词;(3)发送信号;(4)解锁互斥量。等待对象的操作流程通常为:(1)对互斥量上锁;(2)等待信号;(3)进行操作;(4)解锁互斥量。

注意三个问题:


while(data.flag == false) //检查谓词为假
{
    while(pthread_cond_wait(&data.cond, &data.mutex) != 0); //等待
}
if(data.flag) //检查谓词为真  
    do_something();
(1)被拦截的唤醒:等待对象在等待信号前应该检测谓词,如果谓词已经为真,则不需要等待,直接操作。

(2)假唤醒:由于其他某些事件也可能把挂起的线程解锁,为了确保线程是因为cond信号到达而接触阻塞,所以通常要把wait放到while循环内,如果是被其他事件解除阻塞,其返回值不为0,被解除阻塞的线程会再次执行wait函数而被阻塞。

(3)在线程被唤醒,继续下一步操作前,先检查一下谓词条件是否为真。尤其是在使用广播唤醒时,某些线程可能会超前改变谓词的状态。

使用pthread_cond_timewait()阻塞线程时,如果线程因为超时而解除阻塞,下一步先检查谓词是否已经为真,如果为真则进行预定操作。

唤醒等待线程的两种方式:发信号和广播。如何选择?

(1)当多个可以完成某工作的线程被阻塞时,只需要一个线程被唤醒来完成此工作,使用发信号;

(2)为多个谓词条件使用1个条件变量时,使用广播,虽然被阻塞的线程都被唤醒,但是通过检测谓词,谓词为假的线程会继续被阻塞。

(3)多个线程同时被唤醒,使用广播;只有一个等待线程时使用发信号,因为效率更高。

你可能感兴趣的:(pthreads,条件变量)