我有一个MFC应用程序。在InitInstance()中,我创建了一个命名的互斥锁,并通过调用WaitForSingleObject()立即获取了它。在ExitInstance()中,互斥体被释放。
BOOL CMyApp::InitInstance()
{
m_hMutex = CreateMutex( NULL, FALSE, "MyAppMutex" );
DWORD dwRes = WaitForSingleObject( m_hMutex, INFINITE );
switch( dwRes )
{
case WAIT_ABANDONED:
break;
case WAIT_OBJECT_0:
break;
}
}
BOOL CMyApp::ExitInstance()
{
::ReleaseMutex( m_hMutex );
::CloseHandle( m_hMutex );
}
我从Mutex文档中了解到,如果某个进程退出而没有释放所获取的互斥锁,则当另一个进程尝试获取它时,WaitForXXXObject()将返回WAIT_ABANDONED。
为了测试这一点,我运行了我的应用程序,并使用任务管理器将其杀死,因此不会调用ReleaseMutex。但是,当我再次运行该应用程序时,InitInstance()中的WaitForSingleObject()返回WAIT_OBJECT_0。这是预期的行为吗?
最佳答案
从MSDN page on CreateMutex
:
确实,当您终止进程时,互斥锁将处于废弃状态,但是第二句话告诉我们,如果您终止了唯一打开该进程的进程,则该互斥锁将不再存在。
当您重新启动应用程序时,您将重新创建一个新的互斥锁,因为没有其他进程对其进行处理。