2012-12-18 59 views
0

使用C++ 11標準庫(最終只有boost::thread的幫助)有一個乾淨的方式來實現N個讀取器--1個生產者解決方案,所有讀者,一旦通過生產者同時通知(例如std::condition_variable::notify_all()),則保證在生產者最終將第二次進入其關鍵部分之前進入他們的關鍵部分。換句話說,所有通知的讀者必須遵守共享資源的相同狀態。一旦生產者注意到N個閱讀器,它就不能修改共享資源,直到所有N個閱讀器完成閱讀。請注意,boost :: barrier並不是我所需要的,因爲我事先不知道N. N可能因通知而異。N個併發讀者和1個生產者的成語或模式

回答

1

您可以使用atomic counters,以及來自生產者線程的一些輪詢。

當計數器達到N0(這取決於你)時,生產者可以開始工作並生產任何需要生產的東西。在通知條件變量之前,生產者將計數器設置爲0(或N)。

閱讀器完成後,它只是增加(或減少)計數器。

+0

它沒有一個櫃檯工作:如果*新*讀者前來生產者通知等待讀者後會發生什麼?如果新讀者(原子)增加「老年」讀者減少的相同計數器,那麼製片人可能永遠不會醒來。 – Martin

+0

@Martin倒數到零。如果一個新的閱讀器出現(或消失),那麼只需增加(或減少)'N',然後在生產者中檢查小於或等於零。 –

+0

我仍然沒有看到如何增加/減少計數器,這種方式解決了我的問題。假設有兩位讀者正在等待。製片人通知他們所有人,所以N變成2.第一個讀者減少計數器,N = 1。好。現在,如果第三個讀者到達,它不應該增加計數器,因爲它不屬於兩個讀者的組。它應該等待來自制作人的第二個通知,該通知只能在第二個閱讀器完成其工作之後纔開始。 – Martin

1

你描述被稱爲什麼barrier

+0

這幾乎是一個障礙,因爲我不知道有多少讀者(N不是固定的)會在製片人通知他們時等待。我會更清楚地說明這一點,謝謝。 – Martin

相關問題