c++ - 共享内存 - 需要同步

标签 c++ windows concurrency shared-memory

我见过一个项目,其中进程之间的通信是使用共享内存进行的(例如,在 Windows 下使用 ::CreateFileMapping),每次其中一个进程想要通知某些数据可用时共享内存,一种使用命名事件的同步机制通知相关方共享内存的内容发生了变化。

我担心这样一个事实,即读取新信息的进程不存在适当的内存栅栏,以知道它必须使它的数据拷贝无效并在它被“发布”后从主内存中读取它生产者进程。

您知道如何在 Windows 上使用共享内存实现这一点吗?

编辑 只是想补充一点,在创建文件映射后,进程仅使用 MapViewOfFile() API 一次,并且对共享数据的每次新修改都使用通过初始调用 MapViewOfFile() 获得的指针来读取通过共享内存发送的新数据。正确的同步是否要求每次共享内存中的数据更改时,读取数据的进程必须每次都创建 MapViewOfFile()?

最佳答案

如果您使用 Windows 命名事件来通知更改,那么一切都应该没问题。

进程 A 更改数据并调用 SetEvent

进程 B 使用 WaitForSingleObject 或类似的方法等待事件,并看到它已设置。

然后进程 B 读取数据。 WaitForSingleObject 包含所有必要的同步,以确保进程 A 在调用 SetEvent 之前所做的更改被进程 B 读取。

当然,如果您在调用 SetEvent 之后 对数据进行了任何更改,那么当进程 B 读取数据时,这些更改可能会也可能不会显示。

如果您不想使用事件,您可以使用使用 CreateMutex 创建的 Mutex,或者您可以使用 Interlocked... 编写无锁代码InterlockedExchangeInterlockedIncrement 等函数。

无论您如何进行同步,都不需要多次调用 MapViewOfFile

关于c++ - 共享内存 - 需要同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10175691/

相关文章:

c++ - 如何正确使用三元运算符

windows - 为什么 Windows 上的 cmd.exe shell 会因使用正斜杠 ('/' ') 路径分隔符的路径而失败?

windows - 有没有办法连接到 Windows 文件系统,以便对于特定目录,我可以使用自定义代码控制每一位?

windows - Qt creator Debug模式真的很慢

concurrency - 从 mpsc UnboundedReceiver 读取所有可用消息,而不会不必要地阻塞

java - Android runOnUiThread线程安全

scala - Scala actor 可以同时处理多个消息吗?

c++ - 重载解析和显式模板参数

c++ - 高分辨率定时器与低分辨率定时器

c++ - 从 for_each 循环获取当前索引