1

I have a question about Windows IPC. I implemented IPC with mutex on Windows, but there is a problem when I made the connection with another thread;when the thread terminated, the connection is closed.

  1. The connection thread(A) makes connection to the server
  2. Main thread(B) uses the connection handle(global variable) returned by A
  3. A terminates
  4. B cannot refer the handle any more - because connection is closed

It is natural that mutex is released when the process terminated. However, in the case of thread, I need the way to hold mutex to maintain connection even though the thread terminated, if the process is alive.

Semaphore can be the alternative on Linux, however, on Windows, it is impossible to use semaphor because it cannot sense the abnormal disconnection.

Does someone have any idea?

4

1 回答 1

1

当拥有互斥锁的线程退出时,没有办法阻止它的所有权被释放。

根据具体情况,还有许多其他方法可以解决问题。

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() 函数的作用。您完全有可能通过互斥锁以外的其他方式检测到断开连接。

于 2012-05-10T21:40:11.197 回答