Mutexe

Sie können ein Mutex-Objekt verwenden, um exklusiven Zugriff auf eine Ressource bereitzustellen. Die Mutex-Klasse beansprucht mehr Systemressourcen als die Monitor-Klasse, kann jedoch über Anwendungsdomänengrenzen hinweg gemarshallt, in mehreren Wartevorgängen verwendet sowie zur Synchronisierung von Threads in verschiedenen Prozessen eingesetzt werden. Ein Vergleich der verwalteten Synchronisierungsmechanismen finden Sie unter Overview of Synchronization Primitives (Überblick über Synchronisierungsprimitiven).

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 durch Aufrufen seiner ReleaseMutex-Methode frei. Mutexe weisen Threadaffinität auf. Sie können nur von einem Thread freigegeben werden, in dessen Besitz sie sich befinden. Wenn ein Thread einen Mutex freigibt, den er nicht besitzt, wird im Thread eine ApplicationException ausgelöst.

Da die Mutex-Klasse von WaitHandle abgeleitet wird, können Sie außerdem die statische WaitAll- oder WaitAny-Methode von WaitHandle aufrufen, um den Besitz eines Mutex in Kombination mit anderen Wait-Handles anzufordern.

Wenn ein Mutex im Besitz eines Threads ist, kann dieser Thread genau diesen Mutex bei wiederholten Warteanforderungen angeben, ohne dessen Ausführung zu blockieren. Der Mutex muss jedoch ebenso oft freigegeben werden, um den Besitz freizugeben.

Abgebrochene Mutexe

Wenn ein Thread ohne Freigabe eines Mutex beendet wird, wird der Mutex als abgebrochener Mutex bezeichnet. Dabei handelt es sich häufig um einen Hinweis auf einen schwerwiegenden Programmierfehler, da die Ressource, die durch den Mutex geschützt wird, in einem inkonsistenten Zustand verbleiben kann. Eine AbandonedMutexException-Klasse wird im nächsten Thread ausgelöst, die den Mutex verwendet.

Wenn es sich um einen systemweiten Mutex handelt, kann ein abgebrochener Mutex darauf hinweisen, dass eine Anwendung plötzlich beendet wurde (z.B. über den Windows Task-Manager).

Lokale Mutexe und Systemmutexe

Es gibt zwei Typen von Mutexen: lokale Mutexe und benannte Systemmutexe. Wenn Sie ein Mutex-Objekt mithilfe eines Konstruktors erstellen, der einen Namen akzeptiert, wird es mit einem Betriebssystemobjekt mit dem betreffenden Namen verknüpft. 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 mithilfe der OpenExisting-Methode einen vorhandenen benannten Systemmutex öffnen.

Ein lokaler Mutex ist nur innerhalb des Prozesses vorhanden. Er kann von jedem Thread in einem Prozess verwendet werden, der einen Verweis auf das lokale Mutex-Objekt enthält. Jedes Mutex-Objekt ist ein separater lokaler Mutex.

Sichere Zugriffssteuerung für Systemmutexe

.NET Framework bietet die Möglichkeit, für benannte Systemobjekte Sicherheitsmerkmale der Windows-Zugriffssteuerung 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 sicheren Zugriffssteuerung für Mutexe finden Sie in den Artikeln zu MutexSecurity- und MutexAccessRule-Klasse, der MutexRights-Enumeration, der GetAccessControl-, SetAccessControl- und OpenExisting-Methode der Mutex-Klasse und dem Mutex(Boolean, String, Boolean, MutexSecurity)-Konstruktor.

Hinweis

Die Sicherheit der Zugriffssteuerung für Systemmutexe ist nur mit .NET Framework verfügbar, nicht mit .NET Core oder .NET 5 und höher.

Siehe auch