Ich habe offensichtlich irgendetwas zum Thema Mutex nicht verstanden, vielleicht kann mich jemand aufklären, was ich damit falsch mache?
Ich habe den Code so weit gekürzt, dass nur noch der Fehler übrig bleibt.
Das Programm hängt sich immer dann auf, wenn MyThread den Mutex offen hat während WM_TIMER WaitForSingleObject() aufruft.
Nach meinem Verständnis müsste in dem Fall MyThread sein DoSomething beenden, den Mutex freigeben, dann müsste WM_TIMER den Mutex bekommen und seine Arbeit tun, aber stattdessen hängt das Ganze in einem deadlock und ich verstehe nicht, warum?
Ich habe den Code so weit gekürzt, dass nur noch der Fehler übrig bleibt.
Code:
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int nCmdShow)
{
// CreateWindow usw.
CreateMutex(0,0,"SomeUniqueText");
DWORD nThreadID;
CreateThread(0,0,MyThread,0,0,&nThreadID);
// MessageLoop
}
LRESULT CALLBACK MainWindow(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
static const UINT Timer1 = 1;
switch(msg)
{
case WM_CREATE:
{
SetTimer(hWnd,Timer1,1000,0);
return 0;
}
break;
case WM_TIMER:
{
KillTimer(hWnd,Timer1);
HANDLE hMutex = OpenMutex(SYNCHRONIZE,0,"SomeUniqueText");
WaitForSingleObject(hMutex,INFINITE);
// DoSomething
ReleaseMutex(hMutex);
CloseHandle(hMutex);
SetTimer(hWnd,Timer1,1000,0);
return 0;
}
break;
}
return DefWindowProc(hWnd,msg,wParam,lParam);
}
DWORD WINAPI MyThread(LPVOID data)
{
while(1)
{
HANDLE hMutex = OpenMutex(SYNCHRONIZE,0,"SomeUniqueText");
WaitForSingleObject(hMutex,INFINITE);
// DoSomething
ReleaseMutex(hMutex);
CloseHandle(hMutex);
Sleep(10000);
}
return 0;
}
Das Programm hängt sich immer dann auf, wenn MyThread den Mutex offen hat während WM_TIMER WaitForSingleObject() aufruft.
Nach meinem Verständnis müsste in dem Fall MyThread sein DoSomething beenden, den Mutex freigeben, dann müsste WM_TIMER den Mutex bekommen und seine Arbeit tun, aber stattdessen hängt das Ganze in einem deadlock und ich verstehe nicht, warum?