正确使用pthread_cond_wait

消费者的两种等待方式:

方式1: 

if (empty(queue)) {

    pthread_cond_wait(&queue_has_element, &mutex);

}

element = dequeue(queue);


方式2:

while (empty(queue)) {

    pthread_cond_wait(&queue_has_element, &mutex);

}

element = dequeue(queue);


说明:

方式1的等待存在问题, 如果多个消费者都在等待queue_has_element, 此时, 生产者产生

一个元素, 并调用pthread_cond_broadcast把所有消费者都惊醒, 而元素确只有一个, 这

意味着只有一个消费者可以得到这个元素, 其余消费者应该继续等. 但是方式1. 所有消费者

不等待, 去一个空队列取元素将会发生错误. 方式2是正确的处理方式. 每个消费者醒了之后,

还会检查一次队列, 如果队列依然为空, 则继续等待... 


PS: 如果使用pthread_cond_broadcast来广播信号, 条件变量满足后, 不一定真的代表资

源满足. 只有在使用pthread_cond_signal的情况下, 条件变量的满足才意味着资源也满足.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值