Windows 处理等待所有引用被释放

Windows Handle wait until all references are released

我正在设计的 IPC 系统中有多个进程。每个进程创建一个FileMappingMapViewOfFile作为自己的内存区域。此外,每个进程创建两个信号量来管理它已经创建的 FileMappingMapViewOfFile

为了描述我遇到的问题,假设有 3 个进程:

  1. ProcessA 创建 FileMappingMapViewOfFile 和两个信号量。

  2. ProcessBProcessCProcessA.

  3. 类似
  4. ProcessA 想寄东西给 ProcessB。它连接到 FileMappingMapViewOfFile 以及 ProcessB 的两个信号量并发送它想发送的任何内容。

  5. ProcessB 想重新开启通讯。它关闭了它的 FileMappingMapViewOfFile 以及它的两个信号量。它向进程 AC 发送关闭消息。当进程 AC 收到关闭消息时,它们将关闭 FileMappingMapViewOfFile 的句柄以及与 ProcessB 关联的两个信号量。

  6. ProcessB 关闭了所有句柄,想重新打开。当它尝试创建 MapViewOfFile 时失败,因为进程 AC 尚未关闭 ProcessB 的句柄。

现在(作为临时修复),我让 ProcessB 在关闭时休眠 100 毫秒,以便进程 A 和 C 有时间关闭它们对 ProcessB 的句柄。但是,我想要一个不涉及睡眠的解决方案。

有没有办法让 ProcessB 知道何时 所有对其句柄的引用 s(FileMappingMapViewOfFile 和两个信号量) 是否被所有其他进程释放? 如果有,我如何等待它?

肯定没有 winapi 函数可以做到这一点。您只能尝试打开一个(命名的)对象的句柄并查看它是否因适当的原因而失败。

所以最简单的解决方法是用 Sleep(0) 或类似的东西在循环中做你想做的事情。您还可以为此特定目的添加一个额外的同步对象,一个自动重置的命名事件,您的 ProcessB 可以打开它并且 WaitFor.....