回答

0

條件變量實際上是進程可以等待的一個隊列(不消耗資源)。他們這樣做是因爲他們只有在特定條件成立時才能進行(因此名稱)。 當不同類型的進程必須等待不同的條件成立時,多個條件變量可能會有用。一個很好的例子就是所謂的生產者消費者問題 (http://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem), 當兩種進程共享一個共同的FIFO緩衝區 - 生產者在其中存儲物品時,消費者提取它們。生產者不得不等待,直到緩衝區至少有一個空槽來存放物品。同樣,消費者可能不得不等待緩衝區爲空時。這兩種過程彼此發出信號:當生產者存放物品時,它向消費者發信號通知緩衝區不是空的;當消費者提取物品時,它向生產者發出緩衝區未滿的信號。 儘管僅使用一個條件變量解決問題並非不可能,但使用兩個條件變得更自然(更高效):一個用於生產者,另一個用於消費者。

存在一些需要類似方法的其他「問題」,例如,讀者,作家和熟睡的理髮師。

+0

您提到問題在接近尾聲時更爲「高效」。這是爲什麼?當你廣播喚醒線程時,並不是所有的人都檢查條件(儘管我認爲只有隊列中第一個滿足條件的人獲得了鎖) – CoderNinja

+0

當有兩個隊列時,你只喚醒1個進程(或線程,我們可以在這種情況下互換使用這些術語)來自適當的隊列 - 在這種情況下沒有廣播。但是,當只有一個隊列時,你不能選擇性地喚醒「正確」的過程,而必須喚醒每個過程。 – xxa

+0

強調進程不會主動檢查條件以成爲真實,他們睡在隊列中不需要處理器時間,這一點也很重要。這就是爲什麼它有多少人被踢出隊列。 – xxa