Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 互斥所有者状态_Winapi_User32 - Fatal编程技术网

Winapi 互斥所有者状态

Winapi 互斥所有者状态,winapi,user32,Winapi,User32,使用Windows互斥函数使应用程序成为一个实例我想知道如何判断互斥对象(如果存在)是否为“所有”,以便在前一个实例崩溃时可以忽略它是否为有效对象 您的主要目标是拥有应用程序的单个实例 您可以创建一个互斥体而不获取它,将bInitialOwner设置为FALSE,这样就可以用作标签 启动时,检查互斥锁是否退出,如果退出,请进行清理,例如通知现有进程,然后退出 如果没有,创建一个而不获取它 例如: HANDLE Mutex; DWORD Error; Mutex = Create

使用Windows互斥函数使应用程序成为一个实例我想知道如何判断互斥对象(如果存在)是否为“所有”,以便在前一个实例崩溃时可以忽略它是否为有效对象

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

  • 您可以创建一个互斥体而不获取它,将
    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);
如果要检查互斥锁是否拥有,可以使用零超时调用:

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
的情况下终止或崩溃,系统将自动关闭句柄:

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


崩溃并被Windows终止的程序不能拥有互斥锁。谷歌搜索“windows单实例互斥体”会给你带来15.6万次点击,你肯定能找到一个你可以接受的。谢谢你,我知道一个程序崩溃了,它不能拥有互斥体,但互斥体仍然可以存在于它的废弃状态,而我想检查的正是这种状态。不,显然,只有一个进程可以拥有互斥体,即单实例应用程序的点。它不是在坠机时被“抛弃”的,它不再是了。它停止了。这是一个向上推雏菊的过程。它渴望峡湾,它是一只死鹦鹉。听着,感谢你的态度和讽刺,但是我只是根据“使用互斥对象”中的注释问了一个问题,其中清楚地指出“如果互斥被放弃,拥有互斥的线程在终止前没有正确地释放它。”。在这种情况下,共享资源的状态是不确定的,我要检查的就是这种状态,正如问题的标题明确指出的那样。这种情况不适用。如果拥有互斥体的线程退出,互斥体将被放弃。但是,如果进程退出,互斥锁将被删除——当然,除非另一个进程具有该互斥锁的句柄。如果检查所有权,则有获取所有权的风险,因此,如果获取所有权,则必须准备释放所有权。