我见过一个项目,其中进程之间的通信是使用共享内存进行的(例如使用::CreateFileMapping
在 Windows 下)并且每当其中一个进程想要通知共享内存中某些数据可用时,一种使用命名事件的同步机制会通知感兴趣的一方共享内存的内容发生了变化。
我担心这样一个事实,即读取新信息的进程不存在适当的内存栅栏,以知道它必须使数据副本无效并在生产者进程“发布”后从主内存中读取它。
您知道如何在 Windows 上使用共享内存来实现这一点吗?
EDIT只是想补充一点,在创建文件映射后,进程仅使用 MapViewOfFile() API 一次,并且对共享数据的每次新修改都使用通过初始调用 MapViewOfFile() 获得的指针来读取通过共享内存发送的新数据。正确的同步是否要求每次共享内存中的数据发生变化时,读取数据的进程每次都必须创建 MapViewOfFile() ?
如果您使用 Windows 命名事件来发出更改信号,那么一切都应该没问题。
进程A改变数据并调用SetEvent
.
进程 B 使用以下命令等待事件WaitForSingleObject
或类似的,并看到它已设置。
然后进程B读取数据。WaitForSingleObject
包含所有必要的同步,以确保进程 A 在调用之前所做的更改SetEvent
被进程B读取。
当然,如果你对数据进行任何更改after呼叫SetEvent
,那么当进程 B 读取数据时,这些可能会出现,也可能不会出现。
如果您不想使用事件,您可以使用使用以下命令创建的互斥体CreateMutex
,或者您可以使用以下方式编写无锁代码Interlocked...
函数如InterlockedExchange
and InterlockedIncrement
.
无论您如何进行同步,都不需要调用MapViewOfFile
不止一次。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)