我正在写一个生产者/消费者程序。我有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);发布于 2013-03-26 21:29:02
如果在生产者编写代码时,只有一个消费者可能有工作要做,那么您应该考虑使用pthread_cond_signal()。这样你就只会醒来一次(注:根据文档,它可能不止一个),而不是所有的消费者。唤醒他们所有人都会导致“雷鸣般的羊群”现象,每个人都会争先恐后地抢夺相同的工作项目,然后他们中的大多数人什么也没做就又睡着了。
发布于 2013-03-26 22:53:22
根据手册页If more than one thread is blocked on a condition variable, the scheduling policy determines the order in which threads are unblocked.
因此,听起来好像如果一堆因素(调度策略、库版本等)是相同的,那么顺序也是相同的。
https://stackoverflow.com/questions/15637973
复制相似问题