Mutex所有者状态

时间:2014-05-26 15:47:35

标签: winapi user32

使用Windows Mutex功能使应用程序成为一个实例,我想知道如何判断Mutex对象(如果存在)是否拥有'或者不是这样,如果前一个实例崩溃,我可以忽略它是一个有效的对象?

1 个答案:

答案 0 :(得分:1)

您的主要目标是拥有该应用程序的单个实例。

  • 您可以在不获取互斥锁的情况下创建互斥锁,将bInitialOwner设置为FALSE,这样您就可以将其用作标签。
  • 在启动时,检查互斥锁是否退出,如果是,则清除,例如,通知现有流程,然后退出。
  • 如果没有,请创建一个而不获取它。

例如:

  HANDLE Mutex;
  DWORD Error;

  Mutex = CreateMutex(NULL, FALSE, TEXT("UniqueMutexName"));
  Error = GetLastError();

  if(Mutex != NULL && Error == ERROR_ALREADY_EXISTS)
  {
    /* another instance running */
    CloseHandle(Mutex);
    ExitProcess(0);
  }
  else if(Mutex == NULL)
  {
    /* different error */
    SetLastError(Error);
  }

  ...

  CloseHandle(Mutex);

如果要检查互斥锁是否拥有,可以在零超时时调用WaitForSingleObject

switch(WaitForSingleObject(Mutex, 0))
{
   case WAIT_ABANDONED:
     /* similar to the bellow, but be careful with this one, if
      * there's some protected shared data it may left corrupted */
  case WAIT_OBJECT_0:
     /* was not acquired, you just acquired it */
     ReleaseMutex(Mutex);
     break;
   case WAIT_TIMEOUT:
    /* already owned */
    break;
   default:
    /* some error */
}  

如果在没有调用CloseHandle的情况下终止或压缩了该过程,系统将自动关闭句柄,CreateMutex

  

使用CloseHandle功能关闭手柄。系统关闭   进程终止时自动处理句柄。互斥对象   在最后一个句柄关闭时被销毁。