我使用命名互斥体来检测应用程序的其他实例并相应退出,并发现有两种方法可以执行此操作:
- 创建互斥锁;忽略它是否已经存在的指示;尝试获得它;使用获取成功/失败的事实。
- 创建互斥锁;使用指示是否已经存在。
我无法决定是否获取互斥体(并在退出时释放)。一方面,获取+释放虽然没有任何已知的区别,但看起来就像 cargo 崇拜,但另一方面,互斥对象的存在听起来像是其实际预期功能的副作用。
那么,我应该执行#1 或#2 来检测应用程序是否已在运行?
最佳答案
互斥体已经存在的指示足以让您知道至少还有一个其他进程。无需为此获取互斥体。
但是只要您拥有互斥体,如果您需要将其他实例锁定在某些代码之外,您就可以使用它。
例如,您可以获取互斥体,直到退出初始化代码。这样,一次只能有一个程序实例处于初始化状态。如果您在打开互斥锁后获取它,则第一个获取互斥锁的人知道其初始化代码中没有其他实例。但更重要的是,没有创建互斥锁的人知道创建互斥锁的人已经完成初始化。
这样,如果实例 2 想要与实例 1 对话,一旦实例 1 能够至少进入互斥锁一次,它就知道实例 1 已准备好监听。如果您按照最初的信号创建互斥体,以绝对确保创建者成为第一个所有者,那么效果会更好。
关于winapi - 使用命名互斥体的存在作为指示符是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2415984/