【发布时间】:2013-05-04 23:35:16
【问题描述】:
我使用共享内存区域将 som 数据获取到第二个进程。
第一个进程使用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 具有总存储内存顺序,我认为您在此处显示的内容应该可以。
-
您有很多未解决的问题。如果您在这里获得的帮助不适合您,那么使用本网站就没有多大意义。
-
@HansPassant:“开放”是指您认为我的一些问题您认为我应该标记为已回答?
标签: winapi visual-c++ shared-memory memory-barriers file-mapping