我试图在Windows环境下使用C / C ++进行进程间通信。
我正在创建一个共享内存页面文件,两个进程获取该文件的句柄。它是这样的:
Process1:初始化共享内存区域。等待Process2填充它。
Process2:获取共享内存区域的句柄。把东西放进去。
我也在process1中创建了一个命名的互斥锁。现在,process1在创建后立即获取互斥锁的所有权(使用WaitSingleObject)。显然,内存区域没有任何内容,所以我需要释放互斥锁。现在我需要等到内存填满而不是再次尝试获取互斥锁。
我在想条件变量。一旦填充了存储区域,Process2就会发出条件变量的信号,process1将立即获取该信息。
但是,根据条件变量的MS文档,它们不会在进程间共享,因为它们不是named
,因此从初始化开始就很清楚。
此外,共享内存区域在任何给定时刻最多可以容纳一个元素,这意味着process2在填充之后无法重新填充,除非process1提取其信息。
从给定的描述中可以清楚地看出,条件变量最适合此目的(或监视器)。那么有办法解决这个问题吗?
答案 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等待数据就绪事件,读取内存并设置缓冲区就绪事件。如果操作正确,则不需要互斥锁。