我见过一个项目,其中进程之间的通信是使用共享内存进行的(例如,在 Windows 下使用 ::CreateFileMapping
),每次其中一个进程想要通知某些数据可用时共享内存,一种使用命名事件的同步机制通知相关方共享内存的内容发生了变化。
我担心这样一个事实,即读取新信息的进程不存在适当的内存栅栏,以知道它必须使它的数据拷贝无效并在它被“发布”后从主内存中读取它生产者进程。
您知道如何在 Windows 上使用共享内存实现这一点吗?
编辑 只是想补充一点,在创建文件映射后,进程仅使用 MapViewOfFile() API 一次,并且对共享数据的每次新修改都使用通过初始调用 MapViewOfFile() 获得的指针来读取通过共享内存发送的新数据。正确的同步是否要求每次共享内存中的数据更改时,读取数据的进程必须每次都创建 MapViewOfFile()?
最佳答案
如果您使用 Windows 命名事件来通知更改,那么一切都应该没问题。
进程 A 更改数据并调用 SetEvent
。
进程 B 使用 WaitForSingleObject
或类似的方法等待事件,并看到它已设置。
然后进程 B 读取数据。 WaitForSingleObject
包含所有必要的同步,以确保进程 A 在调用 SetEvent
之前所做的更改被进程 B 读取。
当然,如果您在调用 SetEvent
之后 对数据进行了任何更改,那么当进程 B 读取数据时,这些更改可能会也可能不会显示。
如果您不想使用事件,您可以使用使用 CreateMutex
创建的 Mutex,或者您可以使用 Interlocked...
编写无锁代码InterlockedExchange
和 InterlockedIncrement
等函数。
无论您如何进行同步,都不需要多次调用 MapViewOfFile
。
关于c++ - 共享内存 - 需要同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10175691/