Dela via


Mutexes

Du kan använda ett Mutex objekt för att ge exklusiv åtkomst till en resurs. Klassen Mutex använder fler systemresurser än Monitor klassen, men den kan ordnas över programdomängränser, den kan användas med flera väntetider och kan användas för att synkronisera trådar i olika processer. En jämförelse av mekanismer för hanterad synkronisering finns i Översikt över synkroniseringsprimitanter.

Kodexempel finns i referensdokumentationen för konstruktorerna Mutex .

Använda mutexes

En tråd anropar WaitOne metoden för en mutex för att begära ägarskap. Anropet blockerar tills mutex är tillgängligt eller tills det valfria tidsgränsintervallet förflutit. Tillståndet för en mutex signaleras om ingen tråd äger den.

En tråd släpper en mutex genom att anropa dess ReleaseMutex metod. Mutexes har trådtillhörighet; Mutex kan alltså bara släppas av den tråd som äger den. Om en tråd släpper en mutex som den inte äger genereras en ApplicationException i tråden.

Mutex Eftersom klassen härleds från WaitHandlekan du även anropa statiska WaitAll metoder eller WaitAny metoder WaitHandle för att begära ägarskap för en Mutex i kombination med andra väntehandtag.

Om en tråd äger en Mutexkan den tråden ange samma Mutex i upprepade anrop för väntebegäran utan att blockera körningen Mutex . Den måste dock släppa så många gånger som möjligt för att frigöra ägarskapet.

Övergivna mutexes

Om en tråd avslutas utan att släppa en Mutex, sägs mutexen vara övergiven. Detta indikerar ofta ett allvarligt programmeringsfel eftersom den resurs som mutex skyddar kan vara i ett inkonsekvent tillstånd. En AbandonedMutexException genereras i nästa tråd som hämtar mutex.

När det gäller en systemomfattande mutex kan en övergiven mutex indikera att ett program plötsligt har avslutats (till exempel med hjälp av Windows Task Manager).

Lokala och system-mutexes

Mutexes är av två typer: lokala mutexes och namngivna system mutexes. Om du skapar ett Mutex objekt med en konstruktor som accepterar ett namn associeras det med ett operativsystemobjekt med det namnet. Namngivna systemljud visas i hela operativsystemet och kan användas för att synkronisera processernas aktiviteter. Du kan skapa flera Mutex objekt som representerar samma namngivna system mutex, och du kan använda metoden för att öppna en befintlig namngiven OpenExisting system mutex.

Det finns bara en lokal mutex i din process. Den kan användas av valfri tråd i processen som har en referens till det lokala Mutex objektet. Varje Mutex objekt är en separat lokal mutex.

Åtkomstkontrollsäkerhet för system mutexes

.NET Framework ger möjlighet att fråga och ställa in Säkerhet för Windows-åtkomstkontroll för namngivna systemobjekt. Vi rekommenderar att du skyddar systemets mutexs från det ögonblick då systemet skapas eftersom systemobjekt är globala och därför kan låsas av annan kod än din egen.

Information om åtkomstkontrollsäkerhet för mutexer finns i MutexSecurity klasserna och MutexAccessRule , MutexRights uppräkningen, GetAccessControl, SetAccessControloch OpenExisting -metoderna för Mutex klassen och Mutex(Boolean, String, Boolean, MutexSecurity) konstruktorn.

Kommentar

Åtkomstkontrollsäkerhet för system mutexes är endast tillgängligt med .NET Framework, det är inte tillgängligt med .NET Core eller .NET 5+.

Se även