Mutex-objekt
Ett mutex-objekt är ett synkroniseringsobjekt vars tillstånd har angetts till signalerat när det inte ägs av någon tråd och inte är signalerat när det ägs. Endast en tråd i taget kan äga ett mutex-objekt, vars namn kommer från det faktum att det är användbart för att samordna ömsesidigt uteslutande åtkomst till en delad resurs. För att till exempel förhindra att två trådar skriver till delat minne samtidigt väntar varje tråd på ägarskap för ett mutex-objekt innan koden som kommer åt minnet körs. När du har skrivit till det delade minnet släpper tråden mutex-objektet.
En tråd använder funktionen CreateMutex eller CreateMutexEx för att skapa ett mutex-objekt. Den skapande tråden kan begära omedelbar ägarskap för mutex-objektet och kan även ange ett namn för mutex-objektet. Den kan också skapa en namnlös mutex. Mer information om namn på mutex-, händelse-, semafor- och timerobjekt finns i Interprocess Synchronization.
Trådar i andra processer kan öppna ett handtag till ett befintligt mutex-objekt genom att ange dess namn i ett anrop till funktionen OpenMutex. Om du vill skicka ett handtag till en namnlös mutex till en annan process använder du DuplicateHandle- funktion eller överordnad-underordnad handtagsarv.
Alla trådar med ett handtag till ett mutex-objekt kan använda någon av de väntefunktionerna för att begära ägarskap för mutex-objektet. Om mutex-objektet ägs av en annan tråd blockerar väntefunktionen den begärande tråden tills den ägande tråden släpper mutex-objektet med hjälp av funktionen ReleaseMutex. Returvärdet för väntefunktionen anger om funktionen returnerades av någon annan anledning än tillståndet för mutex som anges till signalerad.
Om fler än en tråd väntar på en mutex väljs en väntande tråd. Anta inte en fifo-order (first-in, first-out). Externa händelser, till exempel API:er i kernelläge, kan ändra vänteordningen.
När en tråd har fått ägarskap för en mutex kan den ange samma mutex i upprepade anrop till väntefunktioner utan att blockera körningen. Detta hindrar en tråd från att låsa sig själv i väntan på en mutex som den redan äger. För att frigöra ägarskapet under sådana omständigheter måste tråden anropa ReleaseMutex en gång för varje gång som mutexen uppfyllde villkoren för en väntefunktion.
Om en tråd avslutas utan att ägarskapet för ett mutex-objekt frigörs anses mutex-objektet vara övergivet. En väntande tråd kan hämta ägarskapet för ett övergivet mutex-objekt, men väntefunktionen returnerar WAIT_ABANDONED för att indikera att mutex-objektet har avbrutits. Ett övergivet mutex-objekt anger att ett fel har inträffat och att alla delade resurser som skyddas av mutex-objektet är i ett odefinierat tillstånd. Om tråden fortsätter som om mutex-objektet inte hade övergivits anses den inte längre vara övergiven när tråden släpper sitt ägarskap. Detta återställer normalt beteende om ett handtag till mutex-objektet senare anges i en väntefunktion.
Observera att kritiska avsnittsobjekt tillhandahålla synkronisering som liknar den som tillhandahålls av mutex-objekt, förutom att kritiska avsnittsobjekt endast kan användas av trådarna i en enda process.
Relaterade ämnen