Mutexe
Sie können ein Mutex-Objekt verwenden, um exklusiven Zugriff auf eine Ressource bereitzustellen. Die Mutex-Klasse verwendet mehr Systemressourcen als die Monitor-Klasse, sie kann jedoch über Anwendungsdomänengrenzen hinweg gemarshallt, mit mehreren Wartevorgängen verwendet sowie zur Synchronisierung von Threads in verschiedenen Prozessen verwendet werden. Ein Vergleich der verwalteten Synchronisierungsmechanismen finden Sie unter Übersicht über Synchronisierungsprimitiven.
Codebeispiele finden Sie in der Referenzdokumentation für die Mutex-Konstruktoren.
Verwenden von Mutexen
Ein Thread ruft die WaitOne-Methode eines Mutex auf, um dessen 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 frei, indem er seine ReleaseMutex-Methode aufruft. 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 die statische WaitAll-Methode oder WaitAny-Methode von WaitHandle aufrufen, um den Besitz von Mutex zusammen mit anderen Wait-Handles anzufordern.
Wenn Mutex im Besitz eines Threads ist, kann dieser Thread genau diesen Mutex bei wiederholten Warteanforderungen angeben, ohne dessen Ausführung zu blockieren. Mutex muss jedoch ebenso oft freigegeben werden, um den Besitz freizugeben.
Abgebrochene Mutexe
Wenn ein Thread ohne Freigabe von 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. In .NET Framework, Version 2.0, wird AbandonedMutexException im nächsten Thread ausgelöst, der den Mutex verwendet.
Hinweis |
---|
In .NET Framework, Version 1.0 und 1.1, wird ein abgebrochener Mutex auf den signalisierten Zustand festgelegt, und der Besitz geht auf den nächsten wartenden Thread über.Wenn sich kein Thread im Wartezustand befindet, verbleibt Mutex in einem signalisierten Zustand.Es wird keine Ausnahme ausgelöst. |
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 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. Es 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, Version 2.0, bietet die Möglichkeit, für benannte Systemobjekte Sicherheitsmerkmale für die 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.
Weitere Informationen darüber, wie Sie eine sichere Zugriffssteuerung für Mutexe einrichten, finden Sie unter den Themen zu folgenden Elementen: MutexSecurity-Klasse und MutexAccessRule-Klasse, MutexRights-Enumeration, Methoden GetAccessControl, SetAccessControl und OpenExisting der Mutex-Klasse und Mutex(Boolean, String, Boolean, MutexSecurity)-Konstruktor.
Siehe auch
Referenz
Mutex