winapi - 使用命名互斥体的存在作为指示符是个好主意吗?

标签 winapi mutex

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

  1. 创建互斥锁;忽略它是否已经存在的指示;尝试获得它;使用获取成功/失败的事实。
  2. 创建互斥锁;使用指示是否已经存在。

我无法决定是否获取互斥体(并在退出时释放)。一方面,获取+释放虽然没有任何已知的区别,但看起来就像 cargo 崇拜,但另一方面,互斥对象的存在听起来像是其实际预期功能的副作用。

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

最佳答案

互斥体已经存在的指示足以让您知道至少还有一个其他进程。无需为此获取互斥体。

但是只要您拥有互斥体,如果您需要将其他实例锁定在某些代码之外,您就可以使用它。

例如,您可以获取互斥体,直到退出初始化代码。这样,一次只能有一个程序实例处于初始化状态。如果您在打开互斥锁后获取它,则第一个获取互斥锁的人知道其初始化代码中没有其他实例。但更重要的是,没有创建互斥锁的人知道创建互斥锁的人已经完成初始化。

这样,如果实例 2 想要与实例 1 对话,一旦实例 1 能够至少进入互斥锁一次,它就知道实例 1 已准备好监听。如果您按照最初的信号创建互斥体,以绝对确保创建者成为第一个所有者,那么效果会更好。

关于winapi - 使用命名互斥体的存在作为指示符是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2415984/

相关文章:

c++ - WM_CREATE 中的 InvalidateRect 不起作用

multithreading - 互斥锁 : what does "blocking" mean?

c++ - 在 C++ 中从互斥锁定代码中的函数返回的好方法

C - 从带线程的文件中读取

winapi - 移动鼠标光标而不触发 WM_MOUSEMOVE

winapi - 在线程持续时间内更改光标

c - FindWindow() 偶尔失败(尝试 IPC)

c# - 如何优雅地跳出 AbandonedMutexException?

c - 在互斥锁内调用 sleep() 有什么缺点?

c++ - 从窗口的额外字节泄漏内存?