我正在编写生产者/消费者程序。我有 3 个消费者从队列中读取,一个生产者在队列中写入。当生产者在队列中写入内容时,它会使用 phtread_cond_broadcast 进行广播。然后消费者醒了,但我在我的程序中找到了一个模式。其中一个消费者总是先于其他消费者醒来,然后清空队列。我的问题是广播每次都以相同的顺序唤醒所有线程是正常的吗?
制作人:
pthread_mutex_lock(&mutex1);
if(/* write something */)
phtread_cond_broadcast(&cond1)
pthread_mutex_unlock(&mutex1);
消费者:
pthread_mutex_lock(&mutex1);
while(/* queue vide */)
phtread_cond_wait(&cond1);
pthread_mutex_unlock(&mutex1);
如果当生产者写东西时只有一个消费者可能有工作要做,您应该考虑改用 pthread_cond_signal()
。这样你就只会唤醒一个(注意,根据文档,它可能不止一个),而不是所有的消费者。将他们全部唤醒会导致“雷鸣般的群体”现象,即每个人都争先恐后地抢夺同一个工作项目,然后他们中的大多数人什么也没做就回去 sleep 了。
我是一名优秀的程序员,十分优秀!