2009-09-29 13 views
7

Dokumentacja Microsoft nie mówi nic o tym, co się stanie, jeśli błędnie zadzwonię pod ReleaseMutex(), gdy muteks jest już odblokowany.Co się stanie, jeśli dwukrotnie zwolnię funkcję ReleaseMutex()?

Szczegóły:

Próbuję naprawić jakiś kod systemu Windows, bez konieczności dostępu do kompilatora.

Zdaję sobie sprawę, że muteksy WinApi są rekursywne i liczone w odwołaniach. Jeśli korzystałem z tej funkcji, oczywiste jest, że dodatkowe wywołanie ReleaseMutex() przedwcześnie zmniejszy licznik odwołań.

Jednak kod, na który patrzę, nie używa rekursywnie muteksa, więc liczba referencyjna nigdy nie jest wyższa niż "1". To ma zwolnić mutex więcej razy niż to konieczne ... więc co się dzieje? Czy licznik odniesień jest ujemny? Czy pozostanie na zero (odblokowany) i po prostu zwróci niezrozumiały błąd?

(Naturalnie, ten kod nie faktycznie sprawdzić błędy podczas wywołuje te funkcje!)

+0

To jest naprawdę złe pytanie. Nawet gdybym wiedział, "sprawdza pod WinXP", może to wyglądać zupełnie inaczej w Win7. Więc nigdy nie powinieneś tego robić. (UWAGA: Myślę, że jest zaznaczone) – Christopher

+5

Dokumentacja nie jest cicha: http://msdn.microsoft.com/en-us/library/ms685066%28VS.85%29.aspx – peejaybee

+0

peejaybee, powinieneś uaktualnić to skomentuj odpowiedź! –

Odpowiedz

8

peejay warunkiem dobrego łącza w swoim komentarzu do ReleaseMutex documentation. Wierzę, że ta linia z dokumentacji odpowiedzi na swoje pytanie:

funkcja

ReleaseMutex zawiedzie jeśli nazywając wątek nie jest właścicielem obiektu mutex .

Chociaż nie jest to wyraźnie powiedziane, myślę, że zwolnienie muteksu (po raz pierwszy) powoduje, że wątek wywołujący nie będzie już właścicielem obiektu mutex. Tak więc drugie wezwanie po prostu się nie powiedzie. Taka implementacja miałaby sens również dlatego, że umożliwiłaby łatwe wykrycie tego rodzaju błędu (wystarczy sprawdzić wartość zwracaną).

+0

OK, więc jaki błąd jest zwracany? –

+0

"Jeśli funkcja się nie powiedzie, wartość zwracana wynosi zero." – Bill

+0

Oto pełna wycena: "Jeśli funkcja nie powiedzie się, zwracana wartość wynosi 0. Aby uzyskać rozszerzone informacje o błędach, wywołaj GetLastError." Zatem, nazywając GetLastError(), jak mogę odróżnić ten warunek błędu od innych błędów, które mogą wystąpić? –

Powiązane problemy