一.目录互斥方案:这种互斥要求同一目录下不能运行两个应用程序的实例,通常用文件解决之,即程序启动时看看所在目录下有没有一个特定文件的存在,在的话就退出,不在的话就自己创建一个,退出时再删除之。这种情况下,这个临时文件便成了同一目录下程序已经启动实例的标志。为了避免误删除导致此功能失常,可以给文件加上隐藏属性。
二.本机互斥方案:这种互斥要求在一台机器上只能运行一个实例。一种解决办法是在注册表的特定位置进行记录,原理和文件互斥类似;另一个解决办法是利用端口,即程序启动后在某一端口进行监听,这样第二个实例启动时再去监听就不可行了,这种方式很巧妙,无须顾忌程序异常退出问题,只是会无端占用一个端口,有时客观环境不允许这么干。
三.单用户互斥方案:这种互斥要求系统只允许同名用户登录一次,因此服务器端必须存放用户对应的数据,当用户登上时检查这部分数据就可以了,这种方式最棘手的是客户端程序的异常退出导致再也无法登录,但让客户端发心跳包或是服务器端反连客户端来解决。
综上,互斥功能要成功,就要找到互斥对象共同的环境或是上下文。如果找到了,互斥就变成了一个技术问题。