繁体   English   中英

使用Mutex在Windows上与线程进行IPC连接

[英]IPC connection with thread on Windows using Mutex

我对Windows IPC有疑问。 我在Windows上用互斥锁实现了IPC,但是当我与另一个线程建立连接时会出现问题;当线程终止时,连接将关闭。

  1. 连接线程(A)建立与服务器的连接
  2. 主线程(B)使用A返回的连接句柄(全局变量)
  3. A终止
  4. B无法再引用该句柄-因为连接已关闭

当进程终止时,互斥体自然会释放。 但是,对于线程,即使进程终止,我也需要一种方法来保持互斥体以保持连接,即使进程处于活动状态。

信号量可以在Linux上替代,但是,在Windows上,无法使用信号量,因为它无法感知异常断开连接。

有人有什么主意吗?

当拥有互斥量的线程退出时,无法阻止其释放。

根据具体情况,您还可以通过多种其他方式解决问题。

1)您可以更改客户端上的任何代码吗? 例如,如果客户端可执行文件使用的是您提供的用于建立和维护连接的DLL,则可以更改该DLL,以便它使用更合适的对象(例如命名管道)而不是互斥锁,或者可以获取DLL以启动其自己的线程以拥有互斥量。

2)是否有一个以上的客户? 据推测,由于您正在使用互斥锁,因此您一次只希望一个客户端连接。 如果可以安全地假设一次仅连接一个客户端,那么当服务器检测到互斥锁已被放弃时,它可以关闭自己的互斥锁句柄。 当客户端进程退出时,互斥量将被自动删除,因此服务器可以定期检查它是否仍然存在。

3)客户端如何与服务器通信? 服务器可能正在为客户端做一些有用的事情,因此必须有另一个通信通道以及互斥量。 例如,如果客户端正在打开到服务器的命名管道,则可以使用该连接而不是互斥锁来检测客户端进程何时退出。 或者,如果通信通道允许您确定客户端的进程ID,则可以打开该进程的句柄,并使用该句柄检测客户端进程何时退出。

4)如果没有其他解决方案,并且您不得不重写客户端和服务器,请考虑使用更合适的IPC形式,例如命名管道。

额外

5)通常使用过程句柄来等待(或测试)过程终止。 通常,这些句柄是在创建进程时为父级生成的句柄,但是没有理由不使用OpenProcess生成的句柄。 就先例而言,我向您保证,至少有一个使用OpenProcess生成的句柄来监视客户端进程的先例与使用互斥锁的先例一样多。 您很有可能是第一个尝试使用Windows互斥锁来检测进程已退出的人。 :-)

6)大概是SQLDisconnect()函数正在调用ReleaseMutex以便与服务器断开连接。 由于它是从不拥有互斥体的线程执行此操作的,因此除了返回错误代码外,它不会做任何事情,因此服务器没有合理的方法来检测到这种情况。 该函数还会在互斥对象上调用CloseHandle吗? 如果是这样,您可以使用(2)中的方法来检测何时发生这种情况。 这对于调用SQLDisconnect()以及进程退出时均有效。 多个客户端无关紧要,因为它们使用不同的互斥锁。

6a)我说“没有合理的方法”,因为您可以想象使用挂钩来更改ReleaseMutex的行为。 这不是一个好的选择。

7)除了调用ReleaseMutex和/或CloseHandle外,还应仔细检查SQLDisconnect()函数的功能。 除了互斥锁以外,您完全有可能通过其他方法检测到断开连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM