2011-08-09 68 views
1

我有一段共享內存,其中包含一個字符串和兩個進程之間的整數。如何在兩個進程之間保護共享內存中的字符串?

過程A將它和進程B讀取它(而不是相反)

什麼是確保這一進程不會發生更新(寫入)的最有效方式同時進程B正在讀取它? (我應該只是在共享內存中使用標誌,使用信號量,臨界區......)

如果你能指出我正確的方向,我將不勝感激。

謝謝。

視窗,C++

回答

2

由於您具有所需的橫過程同步對象兩個處理。我認爲這意味着你需要使用mutex

1

互斥對象有助於防止數據競爭,並允許在線程之間進行線程安全的數據同步。一個線程通過調用其中一個鎖定函數獲得一個互斥體對象的所有權,並且通過調用相應的解鎖函數來放棄所有權。

如果您正在使用升壓線程,你可以使用它的互斥量和鎖定,更多閱讀請參見下面的鏈接:

http://www.boost.org/doc/libs/1_47_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types

+0

沒有提升,但感謝您的信息.... –

3

您不能使用Critical Section,因爲這些只能用於同一進程內的線程之間的同步。對於進程間同步,您需要使用MutexSemaphore。這兩者之間的區別在於前者只允許單個線程擁有資源,而後者允許最大數量(在創建期間指定)同時擁有資源。

在你的情況下,互斥似乎是適當的。

+0

感謝您澄清關於CS,這是有道理的。 –

1

由於您正在談論兩個進程,系統範圍的互斥鎖將工作,而Windows有這些進程。但是,它們不一定是最有效的方式。

如果你可以在共​​享內存中放置更多的東西,那麼通過原子操作在內存中的標誌上傳遞數據應該是最有效的事情。例如,您可以使用Interlocked functions來實現Dekker's Algorithm(您可能想使用類似YieldProcessor()的內容來避免繁忙的等待)。

+0

不錯,感謝您的鏈接.... –

+0

我最近有一本關於同步這樣的書(我從亞馬遜得到它,所以我沒有意識到它是同步*像這樣*:http://www.amazon。 com/Method-Multiprogramming-Monographs-Computer-Science/dp/038798870X /)。他們一直提到Peterson的算法(http://en.wikipedia.org/wiki/Peterson%27s_algorithm),因爲它可以被推廣。 就個人而言,我會使用系統範圍的互斥鎖來執行除玩具程序以外的任何其他功能。但這個問題要求效率,我相信這符合法案。 –

相關問題