Was ist die Verwendung von Interlocked Class?

1 Antworten


  • 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

Schreibe deine Antwort

Ihre Antwort erscheint nach der Moderation appear