sauge
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