我正在写一个生产者/消费者计划。我有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);
答案 0 :(得分:0)
如果生产者写东西时只有一个消费者可能有工作要做,你应该考虑改用pthread_cond_signal()
。这样你只会唤醒一个(根据文件可能不止一个),而不是所有的消费者。唤醒他们所有这些导致了雷鸣般的群体"现象,每个人都赶紧抓住同样的工作项目,然后大多数人都没有做任何事情就回去睡觉了。
答案 1 :(得分:0)
根据手册页If more than one thread is blocked on a condition variable,
the scheduling policy determines the order in which threads
are unblocked.
所以听起来如果一系列因素(调度策略,库版本等)相同,顺序也是一样的。