Mam 2 procesy (A, B) dzielące ten sam muteks (za pomocą wywołań WaitForSingleObject/ReleaseMutex). Wszystko działa dobrze, ale kiedy proces A ulega awarii, proces B mruczy radośnie. Po ponownym uruchomieniu procesu A występuje impas.Wywołany przez Win32 muteks nie został zwolniony, gdy proces się zawiesza
Głębsze dochodzenie ujawnia, że proces B może pomyślnie wywołać funkcję ReleaseMutex() dwukrotnie po zakończeniu procesu A.
Moja interpretacja: Po zakończeniu procesu A, muteks jest nadal zablokowany, ale własność muteksa łatwo przechodzi do procesu B (który jest błędem). Właśnie dlatego nuci się radośnie, wywołując WaitForSingleObject (otrzymując w zamian WAIT_OBJECT_0) i ReleaseMutex (otrzymując w zamian TRUE).
Czy możliwe jest użycie prymitywu synchronizacji o nazwie podobnej do Mutex w taki sposób, że awaria w procesie A spowoduje zwolnienie muteksa?
Jednym z rozwiązań jest użycie SEH i złapanie awarii oraz zwolnienie muteksa, ale mam nadzieję, że system Windows ma solidne prymitywy, które nie powodują takich zakleszczeń podczas awarii procesu.
To może być interesujący artykuł do przeczytania: http://blogs.msdn.com/b/oldnewthing/archive/2005/09/12/463977.aspx –