使用命名互斥锁的存在作为指标是一个好主意吗?

时间:2010-03-10 10:08:18

标签: winapi mutex

我正在使用一个已命名的互斥锁来检测我的应用程序的其他实例并相应地退出,并发现有两种方法可以执行此操作:

  1. 创建互斥锁;忽略它是否已存在的指示;试图获得它;使用获得成功/失败的事实。
  2. 创建互斥锁;使用指示它是否已经存在。
  3. 我无法决定是否获取互斥锁(并在退出时释放)。一方面,获取+释放即使它没有已知的差异看起来像货物结果,但另一方面,互斥对象的存在听起来像其实际预期功能的副作用。

    那么,我应该执行#1还是#2来检测应用程序是否已在运行?

3 个答案:

答案 0 :(得分:2)

互斥锁已存在的指示足以让您知道至少还有一个其他进程。没有必要为此使用互斥锁。

但只要您拥有互斥锁,就可以在需要从某些代码中锁定其他实例时使用它。

例如,您可以使用互斥锁,直到退出初始化代码。这样,您的程序中只有一个实例可以一次初始化。如果在打开互斥锁后使用互斥锁,那么首先获得互斥锁的互斥锁知道其初始化代码中没有其他实例。但更重要的是,没有创建互斥锁的那个知道创建的那个已经完成了初始化。

这样,如果实例2想要与实例1通信,它就知道实例1一旦能够进入互斥锁至少一次就准备好了。如果您最初发信号创建互斥锁,以确保创建者成为第一个拥有者,则效果会更好。

答案 1 :(得分:0)

我不确定,但如果程序崩溃并且没有正确终止,则命名的互斥锁可能仍然存在。如果是这样,存在测试将成功,而没有其他实例正在运行。因此,我个人宁愿尝试获得它; - )

答案 2 :(得分:0)

#1听起来应该如此。

创建互斥锁;忽略它是否已存在的指示;试图获得它;使用获得成功/失败的事实

因为您的应用启动代码可能会执行两次(在简历或类似的操作系统内容中),即使互斥锁已经存在,因为它是由相同的应用ID创建的,所以获取也会成功。