我有一个关于Windows IPC的问题。 我在Windows上用互斥体实现了IPC,但是当我与另一个线程build立连接时出现问题;当线程终止时,连接closures。
连接线程(A)连接到服务器
主线程(B)使用A返回的连接句柄(全局variables)
A终止
B不能再引用句柄 – 因为连接已closures
当进程终止时,互斥体被释放是很自然的。 但是,在线程的情况下,即使线程终止,如果进程还活着,我也需要保持互斥体的方式来保持连接。
信号量可以作为Linux的替代品,但是,在Windows上,使用信号灯是不可能的,因为它不能检测到exception断开。
有人有什么想法吗?
确定套接字和fd之间
如何查看当前用户的计划任务列表
两个叉子和等待的使用
System.UnauthorizedAccessException:创buildCOM组件的实例失败,错误为80070005(C#)
启动runas作为subprocess,并写入密码到标准input?
如何在C#中停止进程,知道它的文件名?
比x86_64 / linux上的glibc更快的math库?
在linux中检查函数库中是否存在
使用glib的散列表的行为
当拥有该线程的线程退出时,无法阻止互斥体的所有权被释放。
1)你能改变客户端上的任何代码吗? 例如,如果客户端可执行文件正在使用您提供的用于建立和维护连接的DLL,则可以更改DLL以使其使用更合适的对象(如命名管道)而不是互斥锁,或者可以让DLL启动自己的线程来拥有互斥锁。
2)有不止一个客户吗? 据推测,由于您正在使用互斥锁,因此您只希望一次连接一个客户端。 如果您可以安全地假定一次只连接一个客户端,那么当服务器检测到互斥体已被放弃时,它可以关闭自己的互斥锁的句柄。 当客户端进程退出时,互斥锁将自动被删除,所以服务器可以定期检查它是否仍然存在。
3)客户端如何与服务器通信? 服务器大概是做一些有用的客户端,所以必须有另一个通信通道以及互斥。 例如,如果客户端正在向服务器打开命名管道,则可以使用该连接而不是互斥锁来检测客户端进程何时退出。 或者,如果通信渠道允许您确定客户端的进程ID,则可以打开进程的句柄,并使用该句柄来检测客户端进程何时退出。
4)如果没有其他的解决方案可以工作,而且你不得不重写客户端和服务器,那么可以考虑使用一个更合适的IPC形式,比如命名管道。
额外
5)通常使用进程句柄来等待(或测试)进程终止。 大多数情况下,这些句柄是在创建进程时为父进程生成的句柄,但没有理由不使用由OpenProcess生成的句柄。 就先例而言,我向你保证,使用由OpenProcess生成的句柄来监视客户端进程与使用互斥量至少有相同的先例; 完全有可能您是第一个尝试使用Windows互斥体来检测进程已经退出的人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。