2012-02-27 93 views
0

可否如果兩個程序同時訪問它的共享存儲器被破壞,一個書寫到它,而另一個從中讀取?共享存儲器C++的讀取和寫入同步

我有兩個方案,一是將得到服務器和網絡的一些數據解析處理的數據保存到共享內存中,我有一個讀程序,將讀取到最後保存的數據集。

例如,如果第一程序已經從服務器100收集到的數據和當前在第101服務器,直到第100個服務器的所有的數據將被由讀取器讀取的程序。一旦第101次完成,閱讀器程序將讀取第101個數據集。 這裏的數據從服務器組可以有多個數據,如磁盤空間,裝載等 所以做這種訪問損壞數據的共享內存?或者我可以這樣做嗎?

+1

C或C++? C中的標籤,C++中的標題。 – vulkanino 2012-02-27 10:30:15

+0

任何特定的體系結構或ISA? – Necrolis 2012-02-27 10:37:03

回答

4

你所描述什麼是真正的併發常見的計算問題稱爲Readers-writers

如果嘗試在其他程序寫它從內存中讀取,你將最有可能獲得損壞的數據。您應該使用同步原語(鎖,信號量,監視器...)之一來確保這種情況永遠不會發生。

我建議你看看The Little Book of Semaphores,尤其是章節4.2讀者 - 作家問題

4

有你與過程,而不是線程這樣做的一個原因?從同步的角度來看,這可能會讓你的生活更加艱難。

如果你正在使用線程,我會告訴你用一個信號保護你的訪問,這樣你就可以保證讀者不讀取作者寫的同一個數據集;我認爲信號量和其他同步原語的實現也存在於進程間共享內存中,但這種情況有點不常見。

你絕對應該使用別人的同步原語的原因是,在現代硬件上,寫可以重新排序或延遲例如第一個程序是「當前在第101臺服務器」,但實際上對第100臺服務器的數據的寫入還沒有從CPU寫回。信號量或互斥量將包含適當的內存屏蔽指令來刷新寫入,以使內存與其他線程/進程看起來一致;你應該絕對使用別人的精心編寫的實現,而不是寫自己的同步邏輯。

此外,當您測試時,在多處理器機器上測試非常重要,因爲進程之間的競爭條件不太可能出現在單處理器盒上。

+1

LihO是對的;在解決這個問題之前,你想先好好閱讀讀者和作者的問題,因爲併發是臭蟲的肥沃基礎。 – zmccord 2012-02-27 10:46:28