我正在设计的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
是否有办法知道何时对其句柄的所有引用(FileMapping
,MapViewOfFile
和两个信号量)所有其他流程发布了什么?如果有,我该怎么办?
答案 0 :(得分:1)
这样做肯定没有winapi功能。您只能尝试打开(命名)对象的句柄,并查看它是否因适当的原因而失败。
所以最简单的解决方法是在Sleep(0)
或类似的循环中尝试做什么。您还可以为此特定目的添加其他同步对象,即ProcessB
可能会打开并WaitFor....
的自动重置命名事件。