2013-03-26 65 views
1

我在写一个生产者/消费者程序。我有三位消费者从队列中读取,一位生产者在队列中写入。 当生产者在队列中写入内容时,它使用phtread_cond_broadcast广播它。然后消费者醒来,但我在我的程序中找到了一个模式。消费者之一总是在其他人面前醒来,然后清理队列。我的问题是广播每次都以相同的顺序唤醒所有线程是正常的吗?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); 
+0

您的pthread_cond_wait可能应该有一个条件参数... – themel 2013-03-26 14:23:07

回答

0

如果只有一个消费者都不可能有工作当制片人写事做,你应该考虑使用pthread_cond_signal()代替。这样你就会醒来只有一个(根据文档可能不止一个),而不是所有的消费者。唤醒他们所有的结果导致了“雷鸣般的牛群”现象,在这种现象中,每个人都在抢同一个工作项目,然后他们中的大多数人回去睡觉而没有做任何事情。

0

根据该男子页If more than one thread is blocked on a condition variable, the scheduling policy determines the order in which threads are unblocked.

所以,它听起来就像如果一堆的因素(调度策略,库版本,等等)是相同的顺序将是一样的好。