我正在设计的IPC系统中有多个进程。每个进程都会创建一个FileMapping
和MapViewOfFile
作为自己的内存区域。此外,每个进程都会创建两个信号量,用于管理已创建的FileMapping
和MapViewOfFile
。
为了描述我遇到的问题,假设 3 个过程:
-
ProcessA
创建FileMapping
、MapViewOfFile
和两个信号量。 -
ProcessB
和ProcessC
做类似于ProcessA
。 -
ProcessA
想向ProcessB
发送一些东西.它连接到FileMapping
和MapViewOfFile
以及ProcessB
的两个信号量,并发送它想要发送的任何内容。 -
ProcessB
希望重新开放其通信。它关闭其FileMapping
和MapViewOfFile
及其两个信号量。它将结束消息发送到进程A
和C
。当进程A
和C
收到关闭消息时,它们将关闭FileMapping
、MapViewOfFile
和与ProcessB
关联的两个信号量的句柄。 -
ProcessB
关闭了所有的把手,想要重新打开。当它尝试创建MapViewOfFile
时,它会失败,因为进程A
和C
尚未关闭句柄以ProcessB
。
现在(作为临时修复),我让ProcessB
在关闭时休眠 100 毫秒,以便让进程 A 和 C 有时间关闭它们的句柄以ProcessB
。但是,我想要一个不涉及睡眠的解决方案。
有没有办法让ProcessB
知道所有其他进程何时释放对其句柄s(FileMapping
、MapViewOfFile
和两个信号量)的所有引用?如果有,我怎么能等呢?
绝对没有 winapi 函数来做到这一点。只能尝试打开(命名)对象的句柄,并查看它是否因适当的原因而失败。
因此,最简单的解决方法是使用Sleep(0)
或类似的东西执行您在循环中尝试的操作。您还可以为此特定目的添加其他同步对象,即您的ProcessB
可能会打开并WaitFor....
的自动重置命名事件。