c + + - Skal en mutex stadig blive frigivet, hvis det går ud?

Indlæg af Hanne Mølgaard Plasc

Problem



Brug af WaitForSingleObject-funktionen. [6]


Hvis funktionen hedder og tider ud, skal den stadig frigive mutex?


dvs. skal ReleaseMutex være i position 1. eller 2. hvis de fem sekunder forløber?


WaitForSingleObject(5 second time out)
{
  //access shared resource

  //1. - ReleaseMutex() here?
}
  //2. - ReleaseMutex() here?

Bedste reference


Nej. Hvis opkaldet til WaitForSingleObject gange ud, så har du ikke erhvervet mutexen, så det skal ikke løsnes.


dvs. du behøver kun ReleaseMutex i position 1.

Andre referencer 1


Din sag nr. 1 er korrekt. Hvis du går ud på dette opkald betyder det, at ressourcen ikke blev erhvervet, og du bør ikke forsøge at frigive det.

Andre referencer 2


Du skal kun frigive mutexen, hvis du har ejerskab. Bemærk at der er 4 mulige returværdier, i 2 tilfælde får du ejerskab, og i 2 gør du det ikke.


WAIT\_ABANDONED - du har ejerskab og skal frigive mutexen, men den tidligere ejer afsluttede uden at udtrykkeligt frigive mutext, så delt tilstand kan være inkonsekvent.


WAIT\_OBJECT\_0 - du har ejerskabet. Du skal frigive mutexten.


WAIT\_TIMEOUT - Mutext blev ikke udgivet i løbet af timeout


WAIT\_FAILED - normalt på grund af en fejl i din kode (dvs. ugyldigt håndtag).