【发布时间】:2017-12-14 22:24:02
【问题描述】:
我正在设计的 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 和两个信号量)何时被所有其他进程释放? 如果有,我怎么等呢?
【问题讨论】:
-
所有对它的句柄的引用你在这下面是什么意思?
-
根据微软的文档,一个对象只有在所有对其句柄的引用都关闭时才会关闭。当您在对象上调用
CloseHandle时,它只会减少对该对象的引用计数。当引用计数达到0时,对象将关闭,您可以重新创建它。我想知道是否有办法检查引用计数。 -
不,你用一般语言描述的内容,你如何尝试实现 ipc - 设计上绝对错误。
-
“想要重新打开”是问题所在。 that 在实际场景中从来没有用过,进程应该在启动时初始化它的映射,直到它终止才关闭它。同步共享内存访问已经够难了,没有必要让它变得更糟。所以不要这样做,问题解决了。
-
@RbMm 感谢您对设计的关注。我正在探索新的设计理念并检查性能升级。这就是这个项目的重点,探索。无论如何,设计比描述的要复杂,我需要大约 5 页来详细描述它是如何工作的,而且它实际上非常快速和可靠。