Eu tenho um aplicativo MFC. Em InitInstance () eu criei um mutex nomeado e adquiri-lo imediatamente chamando WaitForSingleObject (). No ExitInstance () o mutex é liberado.
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 );
}
O que eu entendo da documentação da Mutex é que, se um processo sair sem liberar o mutex adquirido, quando outro processo tentar adquiri-lo, WaitForXXXObject () retornará WAIT_ABANDONED.
Para testar isso eu corri meu aplicativo e mateiusando o gerenciador de tarefas para que o ReleaseMutex não seja chamado. Mas quando eu corri o aplicativo novamente WaitForSingleObject () em InitInstance () retorna WAIT_OBJECT_0. Esse é um comportamento esperado?
Respostas:
4 para resposta № 1De Página do MSDN em CreateMutex
:
O sistema fecha o identificador automaticamente quando o processo é finalizado. O objeto mutex é destruído quando seu último identificador for fechado.
É verdade que o mutex estará em um abandonadoQuando você terminar o processo, a segunda sentença nos diz que o mutex não existirá mais se você encerrou o único processo que o abriu.
Quando você reinicia seu aplicativo, você recria um novo mutex porque nenhum outro processo tinha controle sobre ele.