惊群效应

惊群效应指的是在生产者和消费者模型中,生产者广播时,使得多个消费者产生响应。

测试:把模拟售票系统的49行改成每次只补一张票。

如果用 if , 结果

当第一次补票的时候,因为是if,所有的4个线程都做出反应,但是实际的票只能满足线程1,所以导致另外3个线程提前退出。

改用while, 结果

cond排队的序列是1-2-3-4.

第一次补票,满足了线程1,所以队列变成2-3-4-1. 第二次补票的时候,就满足了线程2.

最终4个线程一起退出。

 

原因:

pthread_cond_wait一共可以分解为三个过程:1、unlock; 2、block and wait; 3、lock。

首先所有的进程都阻塞在第二步,那么生产者broadcast之后,所有的进程都被激活,其中进程1率先抢到锁,而剩余进程阻塞在第三步。

进程1拿到锁后,再进入while判断条件,此时等待条件不成立,进程1跳出while执行剩下程序,最后开锁。

而进程1开锁之后,按照等待顺序,进程2拿到锁。如果用的while,进程2就会再次进入while判断,此时等待条件成立,进程继续等待。而如果用if,就不会有拿到锁之后的判断,引起虚假唤醒。

posted @ 2018-05-25 20:55  Zzz...y  阅读(610)  评论(0编辑  收藏  举报