2016-03-01 67 views
3

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

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

这种同步机制是否保证在内存一致性方面是安全的?也就是说,消费者是否可以保证在收到控制信息后看到制作人写作的完整效果?

回答

2

MSDN

一个重要的例外,从由相同的文件备份任何文件映射对象衍生的文件视图是在特定的时间相干的或相同的。一致性保证了流程中的视图和不同流程映射的视图。

异常与远程文件有关。

即使没有保证,MSalters是正确的,通过命名管道发送消息几乎可以肯定足以确保已写入共享内存的数据已准备好被读取通过另一个进程。

此外,我已经完全按照您所描述的方式处理IPC的应用程序,并且从来没有任何与数据竞争有关的错误。

3

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

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

+0

这是关键点:“实际上IPC控制信息就足够了” –

相关问题