我使用共享内存区域将 som 数据获取到第二个进程。
第一个过程使用和。CreateFileMapping
(INVALID_HANDLE_VALUE, ..., PAGE_READWRITE, ...)
MapViewOfFile
( ... FILE_MAP_WRITE)
第二个过程使用和。OpenFileMapping
(FILE_MAP_WRITE, ...)
MapViewOfFile
( ... FILE_MAP_WRITE)
文档状态:
如果文件映射对象的多个视图在指定时间包含相同的数据,则它们是一致的。如果文件视图派生自同一文件支持的任何文件映射对象,则会发生这种情况。(...)
除了一个重要的例外,从由同一文件支持的任何文件映射对象派生的文件视图在特定时间是连贯的或相同的。对于进程内的视图和由不同进程映射的视图,一致性得到保证。
异常与远程文件有关。(...)
由于我只是按原样使用共享内存(由分页文件支持),我会假设进程之间需要一些同步才能看到另一个进程写入的内存的一致视图。但是我不确定究竟需要什么同步。
我目前的模式(简化)是这样的:
Process1 | Process2
... | ...
/* write to shared mem, */ | ::WaitForSingleObject(hDataReady); // real code has error handling
/* then: */
::SetEvent(hDataReady); | /* read from shared mem after wait returns */
... | ...
这是否足够同步,即使对于共享内存也是如此?
两个进程之间通常需要什么同步?
请注意,在单个进程内部,对的调用SetEvent
肯定会构成一个完整的内存屏障,但我并不完全清楚这是否适用于跨进程的共享内存。