我有一段共享內存,其中包含一個字符串和兩個進程之間的整數。如何在兩個進程之間保護共享內存中的字符串?
過程A將它和進程B讀取它(而不是相反)
什麼是確保這一進程不會發生更新(寫入)的最有效方式同時進程B正在讀取它? (我應該只是在共享內存中使用標誌,使用信號量,臨界區......)
如果你能指出我正確的方向,我將不勝感激。
謝謝。
視窗,C++
我有一段共享內存,其中包含一個字符串和兩個進程之間的整數。如何在兩個進程之間保護共享內存中的字符串?
過程A將它和進程B讀取它(而不是相反)
什麼是確保這一進程不會發生更新(寫入)的最有效方式同時進程B正在讀取它? (我應該只是在共享內存中使用標誌,使用信號量,臨界區......)
如果你能指出我正確的方向,我將不勝感激。
謝謝。
視窗,C++
由於您具有所需的橫過程同步對象兩個處理。我認爲這意味着你需要使用mutex。
互斥對象有助於防止數據競爭,並允許在線程之間進行線程安全的數據同步。一個線程通過調用其中一個鎖定函數獲得一個互斥體對象的所有權,並且通過調用相應的解鎖函數來放棄所有權。
如果您正在使用升壓線程,你可以使用它的互斥量和鎖定,更多閱讀請參見下面的鏈接:
您不能使用Critical Section,因爲這些只能用於同一進程內的線程之間的同步。對於進程間同步,您需要使用Mutex或Semaphore。這兩者之間的區別在於前者只允許單個線程擁有資源,而後者允許最大數量(在創建期間指定)同時擁有資源。
在你的情況下,互斥似乎是適當的。
感謝您澄清關於CS,這是有道理的。 –
由於您正在談論兩個進程,系統範圍的互斥鎖將工作,而Windows有這些進程。但是,它們不一定是最有效的方式。
如果你可以在共享內存中放置更多的東西,那麼通過原子操作在內存中的標誌上傳遞數據應該是最有效的事情。例如,您可以使用Interlocked functions來實現Dekker's Algorithm(您可能想使用類似YieldProcessor()
的內容來避免繁忙的等待)。
不錯,感謝您的鏈接.... –
我最近有一本關於同步這樣的書(我從亞馬遜得到它,所以我沒有意識到它是同步*像這樣*:http://www.amazon。 com/Method-Multiprogramming-Monographs-Computer-Science/dp/038798870X /)。他們一直提到Peterson的算法(http://en.wikipedia.org/wiki/Peterson%27s_algorithm),因爲它可以被推廣。 就個人而言,我會使用系統範圍的互斥鎖來執行除玩具程序以外的任何其他功能。但這個問題要求效率,我相信這符合法案。 –
沒有提升,但感謝您的信息.... –