跨进程互斥锁读/写锁定

时间:2017-11-13 18:15:46

标签: c++ mutex interprocess named

我试图在Windows环境下使用C / C ++进行进程间通信。

我正在创建一个共享内存页面文件,两个进程获取该文件的句柄。它是这样的:

Process1:初始化共享内存区域。等待Process2填充它。

Process2:获取共享内存区域的句柄。把东西放进去。

我也在process1中创建了一个命名的互斥锁。现在,process1在创建后立即获取互斥锁的所有权(使用WaitSingleObject)。显然,内存区域没有任何内容,所以我需要释放互斥锁。现在我需要等到内存填满而不是再次尝试获取互斥锁。

我在想条件变量。一旦填充了存储区域,Process2就会发出条件变量的信号,process1将立即获取该信息。

但是,根据条件变量的MS文档,它们不会在进程间共享,因为它们不是named,因此从初始化开始就很清楚。

此外,共享内存区域在任何给定时刻最多可以容纳一个元素,这意味着process2在填充之后无法重新填充,除非process1提取其信息。

从给定的描述中可以清楚地看出,条件变量最适合此目的(或监视器)。那么有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

条件变量可以在流程中使用,但不能在流程中使用。

尝试使用PIPE_ACCESS_DUPLEX作为开放模式的NamedPipe。这样您就可以从两个流程中获得通信选项。

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365150(v=vs.85).aspx

答案 1 :(得分:0)

互斥体(与大多数同步原语一样)是每个进程对象 - 由同一进程中的不同线程使用。你不能在进程之间共享它(至少在Unix上)。

要在不同进程之间同步事物,您需要使用某种IPC机制进行通信。

答案 2 :(得分:0)

之前我曾使用过这个事件。使用2个命名的自动重置事件。 1个数据就绪事件和一个缓冲就绪事件。 Writer等待缓冲区就绪,写入数据并设置数据就绪事件。 Reader等待数据就绪事件,读取内存并设置缓冲区就绪事件。如果操作正确,则不需要互斥锁。