MutexeMutexes

Sie können ein Mutex-Objekt verwenden, um exklusiven Zugriff auf eine Ressource bereitzustellen.You can use a Mutex object to provide exclusive access to a resource. 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.The Mutex class uses more system resources than the Monitor class, but it can be marshaled across application domain boundaries, it can be used with multiple waits, and it can be used to synchronize threads in different processes. Ein Vergleich der verwalteten Synchronisierungsmechanismen finden Sie unter Overview of Synchronization Primitives (Überblick über Synchronisierungsprimitiven).For a comparison of managed synchronization mechanisms, see Overview of Synchronization Primitives.

Codebeispiele finden Sie in der Referenzdokumentation für die Mutex-Konstruktoren.For code examples, see the reference documentation for the Mutex constructors.

Verwenden von MutexenUsing Mutexes

Ein Thread ruft die WaitOne-Methode eines Mutexes auf, um Besitz anzufordern.A thread calls the WaitOne method of a mutex to request ownership. Der Aufruf wird blockiert, bis der Mutex verfügbar ist oder bis das optionale Timeoutintervall abgelaufen ist.The call blocks until the mutex is available, or until the optional timeout interval elapses. Der Zustand eines Mutex wird signalisiert, wenn er nicht in Besitz eines Threads ist.The state of a mutex is signaled if no thread owns it.

Ein Thread gibt einen Mutex durch Aufrufen seiner ReleaseMutex-Methode frei.A thread releases a mutex by calling its ReleaseMutex method. Mutexe weisen Threadaffinität auf. Sie können nur von einem Thread freigegeben werden, in dessen Besitz sie sich befinden.Mutexes have thread affinity; that is, the mutex can be released only by the thread that owns it. Wenn ein Thread einen Mutex freigibt, den er nicht besitzt, wird im Thread eine ApplicationException ausgelöst.If a thread releases a mutex it does not own, an ApplicationException is thrown in the thread.

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.Because the Mutex class derives from WaitHandle, you can also call the static WaitAll or WaitAny methods of WaitHandle to request ownership of a Mutex in combination with other wait handles.

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.If a thread owns a Mutex, that thread can specify the same Mutex in repeated wait-request calls without blocking its execution; however, it must release the Mutex as many times to release ownership.

Abgebrochene MutexeAbandoned Mutexes

Wenn ein Thread ohne Freigabe eines Mutex beendet wird, wird der Mutex als abgebrochener Mutex bezeichnet.If a thread terminates without releasing a Mutex, the mutex is said to be abandoned. 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.This often indicates a serious programming error because the resource the mutex is protecting might be left in an inconsistent state. In .NET Framework Version 2.0 wird AbandonedMutexException im nächsten Thread ausgelöst, der den Mutex verwendet.In the .NET Framework version 2.0, an AbandonedMutexException is thrown in the next thread that acquires the mutex.

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.In the .NET Framework versions 1.0 and 1.1, an abandoned Mutex is set to the signaled state and the next waiting thread gets ownership. Wenn sich kein Thread im Wartezustand befindet, verbleibt der Mutex in einem signalisierten Zustand.If no thread is waiting, the Mutex remains in a signaled state. Es werden keine Ausnahmen ausgelöst.No exception is thrown.

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).In the case of a system-wide mutex, an abandoned mutex might indicate that an application has been terminated abruptly (for example, by using Windows Task Manager).

Lokale Mutexe und SystemmutexeLocal and System Mutexes

Es gibt zwei Typen von Mutexen: lokale Mutexe und benannte Systemmutexe.Mutexes are of two types: local mutexes and named system mutexes. Wenn Sie ein Mutex-Objekt mithilfe eines Konstruktors erstellen, der einen Namen akzeptiert, wird es mit einem Betriebssystemobjekt mit dem betreffenden Namen verknüpft.If you create a Mutex object using a constructor that accepts a name, it is associated with an operating-system object of that name. Benannte Systemmutexe sind im gesamten Betriebssystem sichtbar, und mit ihrer Hilfe können die Aktivitäten von Prozessen synchronisiert werden.Named system mutexes are visible throughout the operating system and can be used to synchronize the activities of processes. 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.You can create multiple Mutex objects that represent the same named system mutex, and you can use the OpenExisting method to open an existing named system mutex.

Ein lokaler Mutex ist nur innerhalb des Prozesses vorhanden.A local mutex exists only within your process. Er kann von jedem Thread in einem Prozess verwendet werden, der einen Verweis auf das lokale Mutex-Objekt enthält.It can be used by any thread in your process that has a reference to the local Mutex object. Jedes Mutex-Objekt ist ein separater lokaler Mutex.Each Mutex object is a separate local mutex.

Sichere Zugriffssteuerung für SystemmutexeAccess Control Security for System Mutexes

.NET Framework Version 2.0 bietet die Möglichkeit, für benannte Systemobjekte Sicherheitsmerkmale für die Windows-Zugriffssteuerung abzufragen und festzulegen.The .NET Framework version 2.0 provides the ability to query and set Windows access control security for named system objects. Es wird empfohlen, Systemmutexe direkt ab ihrer Erstellung zu sichern, da Systemobjekte global sind und deshalb auch durch Fremdcode gesperrt werden können.Protecting system mutexes from the moment of creation is recommended because system objects are global and therefore can be locked by code other than your own.

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.For information on access control security for mutexes, see the MutexSecurity and MutexAccessRule classes, the MutexRights enumeration, the GetAccessControl, SetAccessControl, and OpenExisting methods of the Mutex class, and the Mutex(Boolean, String, Boolean, MutexSecurity) constructor.

Siehe auchSee also