Mutex根本没有发布

时间:2014-09-19 06:26:50

标签: visual-c++ mutex

我想有一个.exe运行的实例,我在app::InitInstance()

中使用互斥锁,如下所示
hMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, _T("app.0"));
if (!hMutex)
    hMutex = CreateMutex(0, 0, _T("app.0"));

app::ExitInstance()我有

int iii = ReleaseMutex(hMutex);

其中hMutex是一个全局变量:HANDLE hMutex;

这有效并且仅将应用限制为一个实例。但是,关闭后,我使用GetLastError()收到以下消息:“尝试释放不属于调用者的互斥锁。”

2 个答案:

答案 0 :(得分:1)

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682411(v=vs.85).aspx

  

说明

     

如果调用线程不拥有,则ReleaseMutex函数将失败   互斥对象。

     

线程通过使用创建互斥锁来获取互斥锁的所有权    bInitialOwner参数设置为TRUE 或通过在a中指定其句柄   调用其中一个等待函数。当线程不再需要时   拥有互斥对象,它调用ReleaseMutex函数   另一个线程可以获得所有权。

     

线程可以指定它在调用其中一个时已拥有的互斥锁   等待函数而不阻止其执行。这可以防止a   线程来自死锁,同时等待它的互斥锁   已经拥有。但是,要释放其所有权,线程必须调用   ReleaseMutex每次获得所有权一次(或者   通过CreateMutex或等待函数)。

HANDLE WINAPI CreateMutex(
  _In_opt_  LPSECURITY_ATTRIBUTES lpMutexAttributes,
  _In_      BOOL bInitialOwner,
  _In_opt_  LPCTSTR lpName
);

答案 1 :(得分:1)

在这种情况下,不需要拥有或释放互斥锁,因为您没有进行任何资源保护。但是,您可以在其上发出CloseHandle - 这将减少引用计数,当最后一个句柄关闭时,互斥对象将被销毁。您也不需要调用它,因为操作系统会为您执行此操作(并且还会维护引用计数机制)。

然而,当第二个实例运行时(可能显示一个对话框),您可能需要尽快关闭它。在这种情况下,在显示对话框之前("另一个实例正在运行"),您必须关闭它。如果你不这样做,请考虑一个场景:

  1. 通常会开始申请。
  2. 启动另一个实例(错误),新进程检测到它并显示一个对话框(不关闭句柄)。
  3. 您关闭了在步骤1中打开的实际应用程序(但您没有关闭(2)中显示的对话框。)
  4. 现在,您尝试启动应用程序 - 它会说应用程序已在运行 - 实际上它没有运行(只显示一个对话框)。