WaitForSingleObject()没有返回WAIT_ABANDONED

时间:2016-07-19 13:07:14

标签: c++ multithreading mfc

我有一个MFC应用程序。在InitInstance()中,我创建了一个名为mutex并通过调用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。这是预期的行为吗?

1 个答案:

答案 0 :(得分:4)

来自MSDN page on CreateMutex

  

系统在进程终止时自动关闭句柄。当最后一个句柄关闭时,互斥对象将被销毁。

当你终止进程时,互斥锁确实处于废弃状态,但是第二句告诉我们,如果你终止了打开它的唯一进程,那么互斥锁甚至不会存在。

当您重新启动应用程序时,您将重新创建一个新的互斥锁,因为没有其他进程可以处理它。