我在哪里见过进程之间的通信是使用共享内存制造(例如使用一个项目::CreateFileMapping
每次进程的一个想通知的一些数据在共享内存可在Windows下),并使用名为事件同步机制通知利害关系人共享存储的内容发生变化。
我关注的事实是合适的内存栅栏不存在为读取新信息,知道它有无效它的数据的副本,并从主内存中读取它一旦“发表”由生产者进程进程。
你知道如何在Windows操作系统上使用共享内存来完成?
编辑只是想补充一点,在创建文件映射处理之后使用MapViewOfFile()API只有一次,每一个新的修改的共享数据用)由初始调用MapViewOfFile(获得的指针读取发送的共享存储器中的新数据。 不正确的同步要求,在共享内存每次数据进行修改的读取数据必须创建MapViewOfFile()每一次的过程?
如果你使用Windows命名事件信令改变,那么一切都应该没问题。
过程A转换数据,并调用SetEvent
。
方法B等待使用事件WaitForSingleObject
或相似的,并认为它被设置。
方法B然后读取的数据。 WaitForSingleObject
包含所有必要的同步,以保证调用之前进程A所做的更改SetEvent
通过过程B.阅读
当然,如果你打完电话后对数据进行任何更改SetEvent
,那么这些可能会或可能不会显示当进程B读取数据。
如果你不希望使用事件,你可以使用与创建互斥量CreateMutex
,或者你可以用写无锁码Interlocked...
等功能InterlockedExchange
和InterlockedIncrement
。
但是你做同步,你不需要调用MapViewOfFile
不止一次。
什么你要找的共享内存在Windows是InterlockedExchange功能。 看到这里MSDN文章 。 真正重要的部分是引用:
这个函数生成一个完整的存储器屏障(或篱笆),以确保存储器操作按顺序完成。
这将起作用跨进程。 我以前与它的工作,并找到了实现共享内存顶部的互斥样构建它100%可靠。
如何做到这一点的是,你的“设置”价值交换它。 如果你得到“清”后,你有吗(很明显),但如果你拿“设置”回来了,然后别人了吧。 你循环,循环等之间睡觉,直到你“搞定”了。 基本上是这样:
#define LOCK_SET 1
#define LOCK_CLEAR 0
int* lock_location = LOCK_LOCATION; // ensure this is in shared memory
if (InterlockedExchange(lock_location, LOCK_SET) == LOCK_CLEAR)
{
return true; // got the lock
}
else
{
return false; // didn't get the lock
}
如上所述,以及循环播放,直到你“搞定”了。
让我们把过程A B数据消费者数据生产者和过程。 到现在为止,你有一个过程,通知新的数据已经产生进程B的机制。 我建议你创建它告诉进程A的数据已被消耗反向通知(从B到A)。 如果由于性能原因,你不想处理的等待要消耗的数据,你可以建立一个环形缓冲区的共享内存。