Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sie können ein Mutex Objekt verwenden, um exklusiven Zugriff auf eine Ressource zu ermöglichen. Die Mutex Klasse verwendet mehr Systemressourcen als die Monitor Klasse, kann aber über Anwendungsdomänengrenzen hinweg ge marshallt werden, sie kann mit mehreren Wartezeiten verwendet werden und kann verwendet werden, um Threads in verschiedenen Prozessen zu synchronisieren. Einen Vergleich der verwalteten Synchronisierungsmechanismen finden Sie unter Übersicht über Synchronisierungsgrundtypen.
Codebeispiele finden Sie in der Referenzdokumentation für die Mutex Konstruktoren.
Verwenden von Mutexen
Ein Thread ruft die WaitOne-Methode eines Mutexes auf, um Besitz anzufordern. Der Aufruf wird blockiert, bis der Mutex verfügbar ist oder bis das optionale Timeoutintervall abgelaufen ist. Der Zustand eines Mutex wird signalisiert, wenn er nicht in Besitz eines Threads ist.
Ein Thread gibt einen Mutex los, indem er seine ReleaseMutex Methode aufruft. Mutexes haben Threadaffinität; d. h., der Mutex kann nur vom Thread freigegeben werden, der es besitzt. Wenn ein Thread einen Mutex freigibt, den er nicht besitzt, wird im Thread eine ApplicationException ausgelöst.
Da die Mutex-Klasse von WaitHandle abgeleitet ist, können Sie auch die statischen Methoden WaitAll oder WaitAny von WaitHandle aufrufen, um den Besitz eines Mutex in Kombination mit anderen Wartegriffen anzufordern.
Wenn ein Thread über eine Mutex verfügt, kann dieser Thread dieselbe Mutex in wiederholten Warteanforderungsaufrufen angeben, ohne seine Ausführung zu blockieren; er muss jedoch die Mutex so oft freigeben, um den Besitz freizugeben.
Abgebrochene Mutexe
Wenn ein Thread ohne Freigabe eines Mutex beendet wird, wird der Mutex als abgebrochener Mutex bezeichnet. Dies weist häufig auf einen schwerwiegenden Programmierfehler hin, da die Ressource, die der Mutex schützt, möglicherweise in einem inkonsistenten Zustand verbleibt. Eine AbandonedMutexException-Klasse wird im nächsten Thread ausgelöst, die den Mutex verwendet.
Bei einem systemweiten Mutex kann ein verlassener Mutex darauf hinweisen, dass eine Anwendung abrupt beendet wurde (z. B. mithilfe des Windows-Task-Managers).
Lokale Mutexe und Systemmutexe
Es gibt zwei Typen von Mutexen: lokale Mutexe und benannte Systemmutexe. Wenn Sie ein Mutex Objekt mit einem Konstruktor erstellen, der einen Namen akzeptiert, wird es einem Betriebssystemobjekt dieses Namens zugeordnet. Benannte Systemmutexe sind im gesamten Betriebssystem sichtbar, und mit ihrer Hilfe können die Aktivitäten von Prozessen synchronisiert werden. Sie können mehrere Mutex Objekte erstellen, die denselben benannten Systemmutex darstellen, und Sie können die OpenExisting Methode verwenden, um einen vorhandenen benannten Systemmutex zu öffnen.
Ein lokaler Mutex ist nur innerhalb des Prozesses vorhanden. Sie kann von jedem Thread in Ihrem Prozess verwendet werden, der über einen Verweis auf das lokale Mutex Objekt verfügt. Jedes Mutex Objekt ist ein separates lokales Mutex.
Sichere Zugriffssteuerung für Systemmutexe
.NET Framework bietet die Möglichkeit, die Windows-Zugriffssteuerungssicherheit für benannte Systemobjekte abzufragen und festzulegen. Es wird empfohlen, Systemmutexe direkt ab ihrer Erstellung zu sichern, da Systemobjekte global sind und deshalb auch durch Fremdcode gesperrt werden können.
Informationen zur Zugriffssteuerungssicherheit für Mutexes finden Sie unter den Klassen MutexSecurity und MutexAccessRule, der MutexRights-Enumeration, den Methoden GetAccessControl, SetAccessControl und OpenExisting der Mutex-Klasse und dem Mutex(Boolean, String, Boolean, MutexSecurity)-Konstruktor.
Hinweis
Die Zugriffssteuerungssicherheit für System-Mutexe ist nur mit dem .NET Framework verfügbar und steht nicht für .NET Core oder .NET 5+ zur Verfügung.