2009-09-29 25 views
7

La documentazione Microsoft non dice cosa succede se per errore si chiama ReleaseMutex() quando il mutex è già sbloccato.Cosa succede se I ReleaseMutex() due volte?

Dettagli:

sto cercando di sistemare un po 'di codice di Windows senza avere accesso al compilatore.

Mi rendo conto che i mutex WinApi sono tutti ricorsivi e conteggiati con riferimento. Se stavo facendo uso di quella funzione, è ovvio che la chiamata in più ReleaseMutex() avrebbe decrementato prematuramente il contatore di riferimento.

Tuttavia, il codice che sto guardando non utilizza il mutex in modo ricorsivo, quindi il conteggio dei riferimenti non supera mai '1'. E 'fa rilasciare il mutex più volte del necessario ... quindi cosa succede? Il conteggio dei riferimenti diventa negativo? Rimane a zero (sbloccato) e restituisce solo un errore ignorabile?

(Naturalmente, questo codice in realtà non verificare la presenza di errori quando chiama queste funzioni!)

+0

Questa è una domanda davvero brutta. Anche se lo sapessi, 'controlla sotto WinXP' potrebbe essere completamente diverso sotto Win7. Quindi non dovresti davvero mai farlo. (NB: penso sia spuntato) – Christopher

+5

La documentazione non è silenziosa: http://msdn.microsoft.com/en-us/library/ms685066%28VS.85%29.aspx – peejaybee

+0

peejaybee, dovresti aggiornarlo commentare per una risposta! –

risposta

8

peejay fornito un buon collegamento nel suo commento al ReleaseMutex documentation. Credo che questa linea dalla documentazione risponde alla tua domanda:

funzione

Il ReleaseMutex non riesce se il thread chiamante non possiede l'oggetto mutex .

Anche se non è esplicitamente detto, penso che il rilascio di un mutex (la prima volta) fa sì che il thread chiamante di possedere non è più l'oggetto mutex. Quindi la seconda chiamata fallirà semplicemente. Tale implementazione avrebbe senso anche perché consentirebbe facilmente di rilevare questo tipo di errore (basta controllare il valore di ritorno).

+0

OK, quindi quale errore viene restituito? –

+0

"Se la funzione non riesce, il valore restituito è zero." – Bill

+0

Ecco la citazione completa: "Se la funzione non riesce, il valore restituito è zero. Per ottenere informazioni sull'errore esteso, chiama GetLastError." Quindi, dopo aver chiamato GetLastError(), come posso distinguere questa condizione di errore da altri errori che possono verificarsi? –

Problemi correlati