2010-06-26 90 views
2

我是相當新的pthread編程,並試圖讓我的腦袋周圍cond_signal & mutex_lock。我正在寫一個示例程序,它有一個生產者線程和兩個消費線程。一個生產者,兩個消費者和使用pthread_cond_signal&pthread_mutex_lock

生產者和第一個消費者之間有一個隊列,生產者和第二個消費者之間有一個不同的隊列。我的生產者基本上是一個通信接口,它從網絡讀取數據包,並基於配置的過濾器將數據包傳遞給任一消費者。

我正嘗試使用pthread_cond_signal & pthread_mutex_lock生產者和消費者之間的以下方式。

[在生產者]

0)等待分組到達

1)鎖定互斥pthread_mutex_lock(&cons1Mux)

2)所述分組添加到消費者隊列的尾部

3 )信號消費者1過程pthread_cond_signal(&msgForCons1)

4)解鎖互斥鎖pthread_mutex_lock(&cons1Mux)

5)轉到步驟0

[在消費者]

1)鎖定互斥pthread_mutex_lock(&cons1Mux)

2)等待信號pthread_cond_wait(&msgForCons1,&cons1Mux)

3)喚醒之後,讀出的數據包

4)從隊列中刪除。

5)解鎖互斥pthread_mutex_unlock(&cons1Mux)

6)轉到步驟1

是上述步驟是否正確?如果一個切換從消費者線程剛好在步驟5之後發生到生產者線程,那麼即使消費者還沒有開始監聽該信號,生產者是否有可能發信號通知分組正在等待。會造成「錯過信號」嗎?

這些步驟是否還有其他問題?

回答

1

是的,你是對的,你可能有一個問題:如果沒有線程在等待,pthread_cond_signal是一個空操作。它並未排隊等候觸發後續等待。

你應該做的是,在消費者中,一旦你已經獲得互斥量,測試是否有任何工作要做。如果有,那麼你有一個互斥體;取得所有權,更新狀態,並做到這一點。如果沒有什麼可做,你只需要等待。

的cannonical例子是:

decrement_count() 
    { pthread_mutex_lock(&count_lock); 

    while (count == 0) 
     pthread_cond_wait(&count_nonzero, &count_lock); 
    count = count - 1; 
    pthread_mutex_unlock(&count_lock); 
    } 

increment_count() 
    { pthread_mutex_lock(&count_lock); 
    if (count == 0) 
     pthread_cond_signal(&count_nonzero); 
    count = count + 1; 
    pthread_mutex_unlock(&count_lock); 
    } 

注意如何「消費」遞減線程不會坐等如果有什麼東西遞減。該模式同樣適用於count由隊列大小或包含消息的結構的有效性替換的情況。

+0

所以你建議在消費者,步驟2(從我的問題)應該是等待信號,直到隊列爲空。 在此先感謝。 – 2010-06-27 13:08:06

+1

呃,不完全。我會說:「如果隊列是空的,然後等待;否則,如果隊列不是空的,處理隊列項目」。 – timday 2010-06-27 18:29:18

+0

謝謝。我的意思是一樣的。應該有更好的措辭。 – 2010-07-08 14:44:27