共享内存是否与Windows中的进程保持一致?

时间:2016-03-01 18:31:37

标签: winapi

我需要在同一台机器上的两个进程之间进行一些高比特率的流式传输。为了避免过度复制,我的想法是分配一个包含实际数据的大型共享内存缓冲区(通过CreateFileMapping),并使用管道来控制消息。

这个想法是生产者将一大块数据写入共享内存,然后通过管道发送消息,有效地将所有权传递给消费者。消费者直接在共享内存上执行其业务,然后发送另一条消息以将内存释放回生产者。无限重复。

这种同步机制在内存一致性方面是否保证安全?即,消费者是否可以保证在收到控制消息后看到生产者写入的完整效果?

2 个答案:

答案 0 :(得分:3)

出于实际目的,跨进程的共享内存与单个进程的两个线程共享的普通内存具有相同的属性。也就是说,理论上你需要一个内存栅栏/屏障。我怀疑在实践中IPC控制信息就足够了。

在CPU级别,共享内存在两个进程中的物理上都是相同的RAM。这只是在各个页表中具有兼容的虚拟到物理映射的问题。

答案 1 :(得分:2)

来自MSDN

  

有一个重要的例外,从同一文件支持的任何文件映射对象派生的文件视图在特定时间是一致的或相同的。对于进程内的视图和由不同进程映射的视图,可以保证一致性。

     

该例外与远程文件有关。

即使不能保证这一点,MSalters也是正确的,通过命名管道发送消息几乎肯定是一个障碍,以确保已写入共享内存的数据已准备好被读取另一个过程。

此外,我已经完成了一个处理IPC的应用程序,正如您所描述的那样,并且从未出现任何与数据竞争相关的错误。