2013-03-26 67 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.

所以,它聽起來就像如果一堆的因素(調度策略,庫版本,等等)是相同的順序將是一樣的好。