我使用共享內存區域來獲取som數據到第二個進程。具有進程間(未)同步多線程訪問的CreateFileMapping和MapViewOfFile?
第一個過程使用CreateFileMapping
(INVALID_HANDLE_VALUE, ..., PAGE_READWRITE, ...)
和MapViewOfFile
(... FILE_MAP_WRITE)
。
第二步使用OpenFileMapping
(FILE_MAP_WRITE, ...)
和MapViewOfFile
(... FILE_MAP_WRITE)
。
的docs狀態:
文件映射對象 的多個視圖相干如果它們包含在指定的時間相同的數據。 如果文件視圖來自任何由同一文件支持的文件映射對象 ,則會發生這種情況。 (...)
有一個重要的例外,從任何文件映射 派生的文件視圖由同一個文件支持的對象在特定時間是連貫的或相同的。一致性保證了進程內的視圖和 對於由不同進程映射的視圖。
異常與遠程文件有關。 (...)
由於我只是使用共享內存原樣(由分頁文件支持),我會假定進程之間需要進行一些同步以查看內存另一個進程的一致視圖已經寫過了。不過,我不確定需要什麼樣的同步。
當前圖案我已經(簡化的)是這樣的:
Process1 | Process2
... | ...
/* write to shared mem, */ | ::WaitForSingleObject(hDataReady); // real code has error handling
/* then: */
::SetEvent(hDataReady); | /* read from shared mem after wait returns */
... | ...
這是足夠的同步,即使對於共享存儲器?
這兩個過程之間通常需要什麼同步?
請注意,在一個進程內部,調用SetEvent
肯定會構成full memory barrier,但是對於跨進程的共享內存是否適用這一點,我不完全清楚。
文件映射只是獲取2個進程可見的內存區域。由於您在Windows上運行的是x86/x64,並且該CPU具有全部存儲內存排序,所以我認爲您在此顯示的內容應該可以正常運行。 – camelccc 2013-05-10 10:08:46
你有很多*開放性問題。如果你在這裏得到的幫助不適合你,那麼使用這個網站沒什麼意義。 – 2013-05-10 12:39:53
@HansPassant:通過「開放」,你的意思是你認爲我的一些問題是你認爲我應該回答的嗎? – 2013-05-10 12:41:12