0

我使用共享內存區域來獲取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,但是對於跨進程的共享內存是否適用這一點,我不完全清楚。

+0

文件映射只是獲取2個進程可見的內存區域。由於您在Windows上運行的是x86/x64,並且該CPU具有全部存儲內存排序,所以我認爲您在此顯示的內容應該可以正常運行。 – camelccc 2013-05-10 10:08:46

+0

你有很多*開放性問題。如果你在這裏得到的幫助不適合你,那麼使用這個網站沒什麼意義。 – 2013-05-10 12:39:53

+0

@HansPassant:通過「開放」,你的意思是你認爲我的一些問題是你認爲我應該回答的嗎? – 2013-05-10 12:41:12

回答

0

因爲我已經來相信,對內存的訪問同步的目的,它真的重要,如果併發訪問內存的進程或只是withing線程之間的一個過程之間共享。

也就是說,對於Windows上的共享內存(進程之間共享的那個進程),相同的限制和指導原則適用於進程線程之間共享的進程中的「正常」內存。

我相信這個原因是一個進程和一個線程在Windows上有點正交。進程是線程的「容器」,爲了進程能夠做任何事情,它至少需要一個線程。因此,對於映射到多進程地址空間的內存,這些不同進程中運行的線程的同步要求應該與在同一進程中運行的線程的實際要求相同。

所以,我的問題的答案這是否足夠同步,即使是共享內存?是共享內存需要與「正常」內存相同的同步。但是,當然,並非所有同步技術都可以跨越流程邊界進行工作,所以您受限於可以使用的內容。 (exampled的關鍵部分不能跨進程使用。)

0

使用信號燈應該比事件更好。

+0

這個答案可以使用一些解釋。 – 2013-05-10 12:21:31

0

如果這兩個代碼片段都處於循環狀態,那麼除了事件之外,還需要一個互斥鎖,以便在Process2仍在讀取時Process1不會再次開始寫入。具體而言,必須在閱讀或寫作之前獲取互斥,並在閱讀或寫作後發佈。確保在調用Process2中的WFSO之前已釋放互斥鎖。