Quelle est l'utilisation de la classe verrouillée?

1 Réponses


  • Classe interverrouillée

    Fournit des opérations atomiques pour les variables partagées par plusieurs threads.

    Espace de noms : System.Threading
    Assembly : Mscorlib (dans mscorlib.dll)
    Syntaxe
    VB
    C#
    C++
    F#
    JScript
    Copier

    'Declaration

    Public NotInheritable Class Interlocked

    Remarks

    Les méthodes de cette classe aident à protéger contre les erreurs qui peuvent se produire lorsque le planificateur change de contexte pendant la mise à jour d'un thread une variable accessible par d'autres threads, ou lorsque deux threads s'exécutent simultanément sur des processeurs séparés. Les membres de cette classe ne lèvent pas d'exceptions.

    Les méthodes Increment et Decrement incrémentent ou décrémentent une variable et stockent la valeur résultante en une seule opération. Sur la plupart des ordinateurs, l'incrémentation d'une variable n'est pas une opération atomique, nécessitant les étapes suivantes :

       1.

      Charger une valeur à partir d'une variable d'instance dans un registre.
       2.

      Incrémentez ou décrémentez la valeur.
       3.

      Stockez la valeur dans la variable d'instance.

    Si vous n'utilisez pas Increment et Decrement, un thread peut être préempté après l'exécution des deux premières étapes. Un autre thread peut alors exécuter les trois étapes. Lorsque le premier thread reprend l'exécution, il écrase la valeur dans la variable d'instance et l'effet de l'incrément ou de la décrémentation effectué par le deuxième thread est perdu.

    La méthode Exchange échange de manière atomique les valeurs des variables spécifiées. La méthode CompareExchange combine deux opérations : comparer deux valeurs et stocker une troisième valeur dans l'une des variables, en fonction du résultat de la comparaison. Les opérations de comparaison et d'échange sont effectuées comme une opération atomique.
    Exemples

    L'exemple de code suivant montre un mécanisme de verrouillage de ressources thread-safe.
    VB
    C#
    C++
    F#
    JScript
    Copy

    Imports System
    Imports System.Threading

    Namespace InterlockedExchange_Example
        Class MyInterlockedExchangeExampleClass
      '0 pour false, 1 pour true.
      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 = New Thread(AddressOf MyThreadProc)
      myThread.Name = String.Format("Thread{0}", I + 1)

      'Attendez un laps de temps aléatoire avant de démarrer le prochain thread.
      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()

      'Attendez 1 seconde avant la prochaine tentative.
      Thread.Sleep(1000)
      Next I
      End Sub

      'Une méthode simple qui refuse la réentrance.
      Shared Function UseResource() As Boolean
      '0 indique que la méthode n'est pas utilisée.
      Si 0 = Interlocked.Exchange(usingResource, 1) Then
      Console.WriteLine("{0} a acquis le verrou", Thread.CurrentThread.Name)

      'Le code pour accéder à une ressource qui n'est pas thread-safe irait ici.
      'Simuler un
      fil de travail . Sommeil (500)

      Console.WriteLine("{0} exiting lock", Thread.CurrentThread.Name)

      'Libérez le verrou
      Interlocked.Exchange(usingResource, 0)
      Return True
      Else
      Console.WriteLine("{0} s'est vu refuser le verrou", Thread.CurrentThread .Name)
      Renvoie False
      End If
      End Function
        End Class
    End Namespace

Ecrivez votre réponse

Votre réponse apparaîtra après modération