Winapi 互斥所有者状态
使用Windows互斥函数使应用程序成为一个实例我想知道如何判断互斥对象(如果存在)是否为“所有”,以便在前一个实例崩溃时可以忽略它是否为有效对象 您的主要目标是拥有应用程序的单个实例Winapi 互斥所有者状态,winapi,user32,Winapi,User32,使用Windows互斥函数使应用程序成为一个实例我想知道如何判断互斥对象(如果存在)是否为“所有”,以便在前一个实例崩溃时可以忽略它是否为有效对象 您的主要目标是拥有应用程序的单个实例 您可以创建一个互斥体而不获取它,将bInitialOwner设置为FALSE,这样就可以用作标签 启动时,检查互斥锁是否退出,如果退出,请进行清理,例如通知现有进程,然后退出 如果没有,创建一个而不获取它 例如: HANDLE Mutex; DWORD Error; Mutex = Create
- 您可以创建一个互斥体而不获取它,将
设置为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万次点击,你肯定能找到一个你可以接受的。谢谢你,我知道一个程序崩溃了,它不能拥有互斥体,但互斥体仍然可以存在于它的废弃状态,而我想检查的正是这种状态。不,显然,只有一个进程可以拥有互斥体,即单实例应用程序的点。它不是在坠机时被“抛弃”的,它不再是了。它停止了。这是一个向上推雏菊的过程。它渴望峡湾,它是一只死鹦鹉。听着,感谢你的态度和讽刺,但是我只是根据“使用互斥对象”中的注释问了一个问题,其中清楚地指出“如果互斥被放弃,拥有互斥的线程在终止前没有正确地释放它。”。在这种情况下,共享资源的状态是不确定的,我要检查的就是这种状态,正如问题的标题明确指出的那样。这种情况不适用。如果拥有互斥体的线程退出,互斥体将被放弃。但是,如果进程退出,互斥锁将被删除——当然,除非另一个进程具有该互斥锁的句柄。如果检查所有权,则有获取所有权的风险,因此,如果获取所有权,则必须准备释放所有权。