Übersicht über SynchronisierungsprimitiveOverview of synchronization primitives

.NET bietet eine Reihe von Typen, mit denen Sie den Zugriff auf eine freigegebene Ressource synchronisieren oder die Threadinteraktion koordinieren können..NET provides a range of types that you can use to synchronize access to a shared resource or coordinate thread interaction.

Wichtig

Verwenden Sie die gleiche Synchronisierungsprimitivinstanz, um den Zugriff einer freigegebenen Ressource zu schützen.Use the same synchronization primitive instance to protect access of a shared resource. Wenn Sie verschiedene Synchronisierungsprimitivinstanzen verwenden, um dieselbe Ressource zu schützen, umgehen Sie den Schutz, der von einem Synchronisierungsprimitive bereitgestellt wird.If you use different synchronization primitive instances to protect the same resource, you'll circumvent the protection provided by a synchronization primitive.

WaitHandle-Klasse und einfache SynchronisierungstypenWaitHandle class and lightweight synchronization types

Von der System.Threading.WaitHandle-Klasse werden mehrere .NET-Synchronisierungsprimitive abgeleitet, die ein natives Handle für die Betriebssystemsynchronisierung kapselt, und einen Signalmechanismus für die Threadinteraktion verwendet.Multiple .NET synchronization primitives derive from the System.Threading.WaitHandle class, which encapsulates a native operating system synchronization handle and uses a signaling mechanism for thread interaction. Diese Klassen umfassen:Those classes include:

  • System.Threading.Mutex gewährt exklusiven Zugriff auf eine freigegebene Ressource.System.Threading.Mutex, which grants exclusive access to a shared resource. 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.
  • System.Threading.Semaphore schränkt die Anzahl von Threads ein, die gleichzeitig auf eine freigegebene Ressource oder einen Pool von Ressourcen zugreifen können.System.Threading.Semaphore, which limits the number of threads that can access a shared resource or a pool of resources concurrently. Der Status eines Semaphors wird auf „signalisiert“ festgelegt, wenn die Anzahl größer als Null ist, bzw. wird auf „nicht signalisiert“ gesetzt, wenn die Anzahl Null ist.The state of a semaphore is set to signaled when its count is greater than zero, and nonsignaled when its count is zero.
  • System.Threading.EventWaitHandle stellt ein Threadsynchronisierungsereignis dar und kann sich entweder in einem signalisierten oder nicht signalisierten Zustand befinden.System.Threading.EventWaitHandle, which represents a thread synchronization event and can be either in a signaled or unsignaled state.
  • System.Threading.AutoResetEvent wird aus EventWaitHandle abgeleitet und wird nach der Freigabe eines einzelnen wartenden Threads automatisch in einen nicht signalisierten Zustand zurückgesetzt, wenn einen Signalisierung eintritt.System.Threading.AutoResetEvent, which derives from EventWaitHandle and, when signaled, resets automatically to an unsignaled state after releasing a single waiting thread.
  • System.Threading.ManualResetEvent wird aus EventWaitHandle abgeleitet bleibt bei einer Signalisierung in einem signalisierten Zustand, bis die Reset-Methode aufgerufen wird.System.Threading.ManualResetEvent, which derives from EventWaitHandle and, when signaled, stays in a signaled state until the Reset method is called.

Da WaitHandle aus System.MarshalByRefObject abgeleitet wird können diese Typen in .NET Framework verwendet werden, um die Aktivitäten von Threads über Anwendungsdomänengrenzen hinweg zu synchronisieren.In the .NET Framework, because WaitHandle derives from System.MarshalByRefObject, these types can be used to synchronize the activities of threads across application domain boundaries.

In .NET Framework und .NET Core können einige dieser Typen benannte Systemsynchronisierungshandles darstellen, die im gesamten Betriebssystem sichtbar sind und für die prozessübergreifende Synchronisierung verwendet werden können:In the .NET Framework and .NET Core, some of these types can represent named system synchronization handles, which are visible throughout the operating system and can be used for the inter-process synchronization:

  • Mutex (.NET Framework und .NET Core),Mutex (.NET Framework and .NET Core),
  • Semaphore (.NET Framework und .NET Core unter Windows),Semaphore (.NET Framework and .NET Core on Windows),
  • EventWaitHandle (.NET Framework and .NET Core unter Windows).EventWaitHandle (.NET Framework and .NET Core on Windows).

Weitere Informationen finden Sie in der Referenz für die WaitHandle-API.For more information, see the WaitHandle API reference.

Einfache Synchronisierungstypen basieren nicht auf zugrunde liegende Betriebssystemhandles und bieten in der Regel eine bessere Leistung.Lightweight synchronization types don't rely on underlying operating system handles and typically provide better performance. Allerdings können sie nicht für die prozessübergreifende Synchronisierung verwendet werden.However, they cannot be used for the inter-process synchronization. Verwenden Sie diese Typen für die Threadsynchronisierung innerhalb einer Anwendung.Use those types for thread synchronization within one application.

Einige dieser Typen stellen Alternativen zu den aus WaitHandle abgeleiteten Typen dar.Some of those types are alternatives to the types derived from WaitHandle. Beispielsweise ist SemaphoreSlim eine einfache Alternative zu Semaphore.For example, SemaphoreSlim is a lightweight alternative to Semaphore.

Synchronisieren des Zugriffs auf eine freigegebene RessourceSynchronization of access to a shared resource

.NET stellt eine Reihe von Synchronisierungsprimitiven zum Steuern des Zugriffs auf eine freigegebene Ressource von mehreren Threads bereit..NET provides a range of synchronization primitives to control access to a shared resource by multiple threads.

Monitor-KlasseMonitor class

Die System.Threading.Monitor-Klasse gewährt den gegenseitig exklusiven Zugriff auf eine freigegebene Ressource, indem sie eine Sperre für das Objekt, das die Ressource identifiziert, abruft oder aufhebt.The System.Threading.Monitor class grants mutually exclusive access to a shared resource by acquiring or releasing a lock on the object that identifies the resource. Während eine Sperre aufrechterhalten wird, kann der Thread, der die Sperre aufrechterhält, die Sperre abrufen und aufheben.While a lock is held, the thread that holds the lock can again acquire and release the lock. Für jeden anderen Thread wird das Abrufen der Sperre blockiert, und die Monitor.Enter-Methode wartet auf die Aufhebung.Any other thread is blocked from acquiring the lock and the Monitor.Enter method waits until the lock is released. Die Enter-Methode ruft eine freigegebene Sperre ab.The Enter method acquires a released lock. Sie können die Monitor.TryEnter-Methode auch verwenden, um die Zeitspanne anzugeben, in der ein Thread versucht, eine Sperre abzurufen.You can also use the Monitor.TryEnter method to specify the amount of time during which a thread attempts to acquire a lock. Da die Monitor-Klasse Threadaffinität hat, muss der Thread, der eine Sperre erhalten hat, die Sperre durch Aufruf der Monitor.Exit-Methode freigeben.Because the Monitor class has thread affinity, the thread that acquired a lock must release the lock by calling the Monitor.Exit method.

Sie können die Interaktion von Threads, die eine Sperre für dasselbe Objekt erhalten, mit den Methoden Monitor.Wait, Monitor.Pulse und Monitor.PulseAll koordinieren.You can coordinate the interaction of threads that acquire a lock on the same object by using the Monitor.Wait, Monitor.Pulse, and Monitor.PulseAll methods.

Weitere Informationen finden Sie in der Referenz für die Monitor-API.For more information, see the Monitor API reference.

Hinweis

Verwenden Sie die lock-Anweisung in C# und die SyncLock-Anweisung in Visual Basic, um den Zugriff auf eine freigegebene Ressource zu synchronisieren, anstatt die Monitor-Klasse direkt zu verwenden.Use the lock statement in C# and the SyncLock statement in Visual Basic to synchronize access to a shared resource instead of using the Monitor class directly. Die Anweisungen werden mithilfe der Enter- und Exit-Methoden implementiert und verwenden den try…finally-Block, um sicherzustellen, dass die erhaltene Sperre aufgehoben wird.Those statements are implemented by using the Enter and Exit methods and a try…finally block to ensure that the acquired lock is always released.

Mutex-KlasseMutex class

Die System.Threading.Mutex-Klasse gewährt wie Monitor exklusiven Zugriff auf eine freigegebene Ressource.The System.Threading.Mutex class, like Monitor, grants exclusive access to a shared resource. Verwenden Sie eine der Mutex.WaitOne-Methodenüberladungen, um den Besitz eines Mutex anzufordern.Use one of the Mutex.WaitOne method overloads to request the ownership of a mutex. Wie Monitor hat auch Mutex Threadaffinität und der Thread, der eine Mutex erworben hat, muss diesen durch den Aufruf der Mutex.ReleaseMutex-Methode freigeben.Like Monitor, Mutex has thread affinity and the thread that acquired a mutex must release it by calling the Mutex.ReleaseMutex method.

Im Gegensatz zu Monitor kann die Mutex-Klasse für die prozessübergreifende Synchronisierung verwendet werden.Unlike Monitor, the Mutex class can be used for inter-process synchronization. Verwenden Sie dazu einen benannten Mutex, der im gesamten Betriebssystem sichtbar ist.To do that, use a named mutex, which is visible throughout the operating system. Verwenden Sie zum Erstellen einer benannten Mutexinstanz einen Mutex-Konstruktor, der einen Namen angibt.To create a named mutex instance, use a Mutex constructor that specifies a name. Sie können auch die Mutex.OpenExisting-Methode aufrufen, um ein vorhandenes benanntes Systemmutex zu öffnen.You also can call the Mutex.OpenExisting method to open an existing named system mutex.

Weitere Informationen finden Sie im Artikel Mutexe und in der Referenz zur Mutex-API.For more information, see the Mutexes article and the Mutex API reference.

SpinLock-StrukturSpinLock structure

Die System.Threading.SpinLock-Struktur gewährt wie Monitor exklusiven Zugriff auf eine freigegebene Ressource, basierend auf der Verfügbarkeit einer Sperre.The System.Threading.SpinLock structure, like Monitor, grants exclusive access to a shared resource based on the availability of a lock. Wenn SpinLock versucht, eine nicht verfügbare Sperre zu erhalten, wartet sie in einer Schleife und überprüft wiederholt, ob die Sperre verfügbar ist.When SpinLock attempts to acquire a lock that is unavailable, it waits in a loop, repeatedly checking until the lock becomes available.

Weitere Informationen zu den Vor- und Nachteilen der Verwendung von SpinLock finden Sie im SpinLock-Artikel und in der Referenz zur SpinLock-API.For more information about the benefits and drawbacks of using spin lock, see the SpinLock article and the SpinLock API reference.

ReaderWriterLockSlim-KlasseReaderWriterLockSlim class

Die System.Threading.ReaderWriterLockSlim-Klasse gewährt exklusiven Schreibzugriff auf eine freigegebene Ressource und ermöglicht es mehreren Threads, gleichzeitig zum Lesen auf die Ressource zuzugreifen.The System.Threading.ReaderWriterLockSlim class grants exclusive access to a shared resource for writing and allows multiple threads to access the resource simultaneously for reading. Möglicherweise möchten Sie ReaderWriterLockSlim verwenden, um den Zugriff auf eine freigegebene Datenstruktur zu synchronisieren, die threadsichere Lesevorgänge unterstützt, aber exklusiven Zugriff für die Durchführung von Schreibvorgängen benötigt.You might want to use ReaderWriterLockSlim to synchronize access to a shared data structure that supports thread-safe read operations, but requires exclusive access to perform write operation. Wenn ein Thread exklusiven Zugriff anfordert (z.B. durch Aufrufen der ReaderWriterLockSlim.EnterWriteLock-Methode), werden nachfolgende Writeranforderungen blockiert, bis alle vorhandenen Reader die Sperre beendet haben und der Writer die Sperre aktiviert und beendet hat.When a thread requests exclusive access (for example, by calling the ReaderWriterLockSlim.EnterWriteLock method), subsequent reader and writer requests block until all existing readers have exited the lock, and the writer has entered and exited the lock.

Weitere Informationen finden Sie in der Referenz für die ReaderWriterLockSlim-API.For more information, see the ReaderWriterLockSlim API reference.

Semaphore- und SemaphoreSlim-KlassenSemaphore and SemaphoreSlim classes

Die System.Threading.Semaphore- und System.Threading.SemaphoreSlim-Klassen schränken die Anzahl von Threads ein, die gleichzeitig auf eine freigegebene Ressource oder einen Pool von Ressourcen zugreifen können.The System.Threading.Semaphore and System.Threading.SemaphoreSlim classes limit the number of threads that can access a shared resource or a pool of resources concurrently. Zusätzliche Threads, die die Ressource anfordern, warten, bis ein Thread das Semaphor freigibt.Additional threads that request the resource wait until any thread releases the semaphore. Da das Semaphor keine Threadaffinität hat, kann ein Thread das Semaphor erhalten und ein anderer kann es freigeben.Because the semaphore doesn't have thread affinity, a thread can acquire the semaphore and another one can release it.

SemaphoreSlim ist eine einfache Alternative zu Semaphore und kann nur für die Synchronisierung innerhalb einer einzelnen Prozessgrenze verwendet werden.SemaphoreSlim is a lightweight alternative to Semaphore and can be used only for synchronization within a single process boundary.

Unter Windows können Sie Semaphore für die prozessübergreifende Synchronisierung verwenden.On Windows, you can use Semaphore for the inter-process synchronization. Erstellen Sie dafür eine Semaphore-Instanz, die ein benanntes Systemsemaphor darstellt, indem Sie einen der Semaphorskonstruktoren verwenden, die einen Namen oder die Semaphore.OpenExisting-Methode angeben.To do that, create a Semaphore instance that represents a named system semaphore by using one of the Semaphore constructors that specifies a name or the Semaphore.OpenExisting method. SemaphoreSlim unterstützt keine benannten Systemsemaphoren.SemaphoreSlim doesn't support named system semaphores.

Weitere Informationen finden Sie im Artikel Semaphore und SemaphoreSlim und in der Referenz zur Semaphore- oder SemaphoreSlim-API.For more information, see the Semaphore and SemaphoreSlim article and the Semaphore or SemaphoreSlim API reference.

Threadinteraktionen oder -signalisierungThread interaction, or signaling

Threadinteraktionen (oder Threadsignalisierung) bedeutet, dass ein Thread zum Fortsetzen des Vorgangs auf eine Benachrichtigung oder ein Signal von einem oder mehreren Threads warten muss.Thread interaction (or thread signaling) means that a thread must wait for notification, or a signal, from one or more threads in order to proceed. Wenn beispielsweise Thread A die Thread.Join-Methode von Thread B aufruft, wird Thread A blockiert, bis Thread B abgeschlossen ist.For example, if thread A calls the Thread.Join method of thread B, thread A is blocked until thread B completes. Die im vorhergehenden Abschnitt beschriebenen Synchronisierungsprimitive bieten einen anderen Mechanismus für die Signalisierung: Durch die Freigabe einer Sperre benachrichtigt ein Thread einen anderen Thread, dass er durch den Erhalt der Sperre fortgesetzt werden kann.The synchronization primitives described in the preceding section provide a different mechanism for signaling: by releasing a lock, a thread notifies another thread that it can proceed by acquiring the lock.

Dieser Abschnitt beschreibt zusätzliche Signalisierungskonstrukte, die von .NET bereitgestellt werden.This section describes additional signaling constructs provided by .NET.

EventWaitHandle-, AutoResetEvent-, ManualResetEvent- und ManualResetEventSlim-KlassenEventWaitHandle, AutoResetEvent, ManualResetEvent, and ManualResetEventSlim classes

Die System.Threading.EventWaitHandle-Klasse stellt ein Threadsynchronisierungsereignis dar.The System.Threading.EventWaitHandle class represents a thread synchronization event.

Ein Synchronisierungsereignis kann entweder in einem nicht signalisierten oder signalisierten Zustand sein.A synchronization event can be either in an unsignaled or signaled state. Wenn der Zustand eines Ereignisses nicht signalisiert ist, wird ein Thread, der die WaitOne-Überladung des Ereignisses aufruft, blockiert, bis ein Ereignis signalisiert wird.When the state of an event is unsignaled, a thread that calls the event's WaitOne overload is blocked until an event is signaled. Die EventWaitHandle.Set Methode legt den Zustand eines Ereignisses auf „signalisiert“ fest.The EventWaitHandle.Set method sets the state of an event to signaled.

Das Verhalten einer signalisierten EventWaitHandle hängt von den Zurücksetzmodus ab:The behavior of an EventWaitHandle that has been signaled depends on its reset mode:

Unter Windows können Sie EventWaitHandle für die prozessübergreifende Synchronisierung verwenden.On Windows, you can use EventWaitHandle for the inter-process synchronization. Erstellen Sie dafür eine EventWaitHandle-Instanz, die ein benanntes Systemsynchronisierungsereignis darstellt, indem Sie einen der EventWaitHandle-Konstruktoren verwenden, die einen Namen oder die EventWaitHandle.OpenExisting-Methode angeben.To do that, create a EventWaitHandle instance that represents a named system synchronization event by using one of the EventWaitHandle constructors that specifies a name or the EventWaitHandle.OpenExisting method.

Weitere Informationen finden Sie im Artikel EventWaitHandle.For more information, see the EventWaitHandle article. Die API-Referenz finden Sie unter EventWaitHandle, AutoResetEvent, ManualResetEvent und ManualResetEventSlim.For the API reference, see EventWaitHandle, AutoResetEvent, ManualResetEvent, and ManualResetEventSlim.

CountdownEvent-KlasseCountdownEvent class

Die System.Threading.CountdownEvent-Klasse stellt ein Ereignis dar, das festgelegt wird, wenn die Anzahl null ist.The System.Threading.CountdownEvent class represents an event that becomes set when its count is zero. Wenn CountdownEvent.CurrentCount größer als Null ist, wird ein Thread, der CountdownEvent.Wait abruft, blockiert.While CountdownEvent.CurrentCount is greater than zero, a thread that calls CountdownEvent.Wait is blocked. Rufen Sie CountdownEvent.Signal auf, um die Anzahl eines Ereignisses zu verringern.Call CountdownEvent.Signal to decrement an event's count.

Im Gegensatz zu ManualResetEvent oder ManualResetEventSlim, mit denen Sie mehrere Threads mit einem Signal von einem Thread entsperren können, können Sie mit CountdownEvent einen oder mehrere Threads mit Signalen von mehreren Threads entsperren.In contrast to ManualResetEvent or ManualResetEventSlim, which you can use to unblock multiple threads with a signal from one thread, you can use CountdownEvent to unblock one or more threads with signals from multiple threads.

Weitere Informationen finden Sie im Artikel CountdownEvent und in der Referenz zur CountdownEvent-API.For more information, see the CountdownEvent article and the CountdownEvent API reference.

Barrier-KlasseBarrier class

Die System.Threading.Barrier Klasse stellt eine Barriere zur Threadausführung dar.The System.Threading.Barrier class represents a thread execution barrier. Ein Thread, der die Barrier.SignalAndWait-Methode aufruft, signalisiert, dass er die Barriere erreicht hat und wartet, bis andere teilnehmenden Threads die Barriere erreichen.A thread that calls the Barrier.SignalAndWait method signals that it reached the barrier and waits until other participant threads reach the barrier. Wenn alle teilnehmenden Threads die Barriere erreichen, werden sie weiter ausgeführt, und die Barriere wird zurückgesetzt und kann wieder verwendet werden.When all participant threads reach the barrier, they proceed and the barrier is reset and can be used again.

Sie können Barrier verwenden, wenn ein oder mehrere Threads die Ergebnisse anderer Threads benötigen, bevor Sie mit der nächsten Berechnungsphase fortfahren.You might use Barrier when one or more threads require the results of other threads before proceeding to the next computation phase.

Weitere Informationen finden Sie im Artikel Barriere und in der Referenz zur Barrier-API.For more information, see the Barrier article and the Barrier API reference.

Interlocked-KlasseInterlocked class

Die System.Threading.Interlocked-Klasse stellt statische Methoden zur Verfügung, die einfache atomare Operationen an einer Variablen durchführen.The System.Threading.Interlocked class provides static methods that perform simple atomic operations on a variable. Diese atomaren Operationen umfassen Addition, Inkrementieren und Dekrementieren, Austausch, bedingter Austausch je nach Vergleich und Lesevorgänge für einen 64-Bit-Ganzzahlenwert.Those atomic operations include addition, increment and decrement, exchange and conditional exchange that depends on a comparison, and read operation of a 64-bit integer value.

Weitere Informationen finden Sie in der Referenz für die Interlocked-API.For more information, see the Interlocked API reference.

SpinWait-StrukturSpinWait structure

Die System.Threading.SpinWait-Struktur stellt Unterstützung für Spin-basierte Wartevorgänge bereit.The System.Threading.SpinWait structure provides support for spin-based waiting. Sie können die Struktur verwenden, wenn ein Thread warten muss, bis ein Ereignis signalisiert oder eine Bedingung erfüllt wird, außer wenn die tatsächliche Wartezeit voraussichtlich kürzer als die erforderliche Wartezeit beim Verwenden eines Wait-Handles oder einer anderen Blockierung des Threads ist.You might want to use it when a thread has to wait for an event to be signaled or a condition to be met, but when the actual wait time is expected to be less than the waiting time required by using a wait handle or by otherwise blocking the thread. Mithilfe von SpinWait können Sie einen kurzen Wartezeitraum angeben und danach nur dann auslösen (z. B. durch Warten oder Ruhezustand), wenn die Bedingung nicht in der angegebenen Zeit erfüllt wurde.By using SpinWait, you can specify a short period of time to spin while waiting, and then yield (for example, by waiting or sleeping) only if the condition was not met in the specified time.

Weitere Informationen finden Sie im Artikel SpinWait und in der Referenz zur SpinWait-API.For more information, see the SpinWait article and the SpinWait API reference.

Siehe auchSee also