【发布时间】:2012-04-27 21:00:32
【问题描述】:
我见过一个项目,其中进程之间的通信是使用共享内存进行的(例如,在 Windows 下使用::CreateFileMapping)并且每次其中一个进程想要通知共享内存中有一些数据可用时,使用的同步机制命名事件通知相关方共享内存的内容发生了变化。
我担心这样一个事实,即读取新信息的进程不存在适当的内存栅栏,以知道它必须使其数据副本无效,并在数据被“发布”后从主内存中读取它生产者进程。
您知道如何在 Windows 上使用共享内存来实现这一点吗?
编辑 只是想补充一点,在创建文件映射后,进程只使用一次 MapViewOfFile() API,并且对共享数据的每次新修改都使用通过初始调用 MapViewOfFile() 获得的指针来读取通过共享内存发送的新数据。正确的同步是否要求每次共享内存中的数据发生变化时,读取数据的进程每次都必须创建 MapViewOfFile() ?
【问题讨论】:
-
要成为一种有效的同步机制,命名事件应该有适当的内存栅栏。您是否有证据表明这可能不会发生?
-
@Alexey:确实,通常是这样,但是标准/规范/等有保证吗?
-
在 windows 上可以使用 CreateEvent api 进行同步。我不知道设置和等待该事件是否会产生获取/释放必要的内存栅栏
标签: c++ windows concurrency shared-memory