Weise
Interlocked-Klasse
Stellt atomare Operationen für Variablen bereit, die von mehreren Threads gemeinsam genutzt werden.
Namespace: System.Threading
Assembly: Mscorlib (in mscorlib.dll)
Syntax
VB
C#
C++
F#
JScript
Copy
'Declaration
Public NotInheritable Class Interlocked
Bemerkungen
Die Methoden dieser Klasse schützen vor Fehlern, die auftreten können, wenn der Scheduler den Kontext wechselt, während ein Thread aktualisiert wird eine Variable, auf die andere Threads zugreifen können oder wenn zwei Threads gleichzeitig auf separaten Prozessoren ausgeführt werden. Die Member dieser Klasse lösen keine Ausnahmen aus.
Die Methoden Increment und Decrement inkrementieren oder dekrementieren eine Variable und speichern den resultierenden Wert in einem einzigen Vorgang. Auf den meisten Computern ist das Inkrementieren einer Variablen kein atomarer Vorgang, der die folgenden Schritte erfordert:
1.
Laden eines Werts aus einer Instanzvariablen in ein Register.
2.
Erhöhen oder verringern Sie den Wert.
3.
Speichern Sie den Wert in der Instanzvariablen.
Wenn Sie Increment und Decrement nicht verwenden, kann ein Thread nach Ausführung der ersten beiden Schritte vorzeitig beendet werden. Ein anderer Thread kann dann alle drei Schritte ausführen. Wenn der erste Thread die Ausführung wieder aufnimmt, überschreibt er den Wert in der Instanzvariablen, und die Wirkung der vom zweiten Thread durchgeführten Inkrementierung oder Dekrementierung geht verloren.
Die Exchange-Methode tauscht die Werte der angegebenen Variablen atomar aus. Die CompareExchange-Methode kombiniert zwei Operationen: Vergleichen von zwei Werten und Speichern eines dritten Werts in einer der Variablen, basierend auf dem Ergebnis des Vergleichs. Die Vergleichs- und Austauschoperationen werden als atomare Operation ausgeführt.
Beispiele
Das folgende Codebeispiel zeigt einen threadsicheren Mechanismus zum Sperren von Ressourcen.
VB
C #
C ++
F #
JScript
Kopieren
Import System
Import System.Threading
Namespace InterlockedExchange_Example
Klasse MyInterlockedExchangeExampleClass
‚0 für falsch, 1 für wahr.
Private Shared usingResource As Integer = 0
Private Const numThreadIterations As Integer = 5
Private Const numThreads As Integer = 10
_
Shared Sub Main()
Dim myThread As Thread
Dim rnd As New Random()
Dim I As Integer
For I = 0 To numThreads - 1
myThread = Neuer Thread(AddressOf MyThreadProc)
myThread.Name = String.Format("Thread{0}", I + 1)
'Warten Sie eine zufällige Zeit, bevor Sie den nächsten Thread starten.
Thread.Sleep(rnd.Next(0, 1000))
myThread.Start()
Next I
End Sub 'Main
Private Shared Sub MyThreadProc()
Dim I As Integer
For I = 0 To numThreadIterations - 1
UseResource()
'Warten Sie 1 Sekunde vor dem nächsten Versuch.
Thread.Sleep(1000)
Next I
End Sub
'Eine einfache Methode, die den Wiedereintritt verweigert.
Shared Function UseResource() Als Boolean
'0 zeigt an, dass die Methode nicht verwendet wird.
If 0 = Interlocked.Exchange(usingResource, 1) Then
Console.WriteLine("{0} hat die Sperre erworben", Thread.CurrentThread.Name)
'Code für den Zugriff auf eine Ressource, die nicht threadsicher ist, würde hierher kommen.
'Simulieren Sie einen Arbeits-
Thread.
Schlaf(500)
Console.WriteLine("{0} exiting lock", Thread.CurrentThread.Name)
'Sperre
freigeben Interlocked.Exchange(usingResource, 0)
Rückgabe True
Else
Console.WriteLine(" {0} wurde die Sperre verweigert", Thread.CurrentThread .Name)
Falsches
Ende zurückgeben If
End Function
End Class
End Namespace