sabio
Clase entrelazada
Proporciona operaciones atómicas para variables que comparten varios subprocesos.
Espacio de nombres: System.Threading
Asamblea: mscorlib (en mscorlib.dll)
Sintaxis
VB
C #
C ++
F #
JScript
Copiar
'Declaración
Pública NotInheritable Clase Interlocked
Observaciones
Los métodos de esta clase de ayuda proteger contra los errores que pueden ocurrir cuando el programador cambia contextos, mientras que un hilo es la actualización una variable a la que pueden acceder otros subprocesos, o cuando dos subprocesos se ejecutan simultáneamente en procesadores separados. Los miembros de esta clase no lanzan excepciones.
Los métodos Incremento y Decremento incrementan o decrementan una variable y almacenan el valor resultante en una sola operación. En la mayoría de las computadoras, incrementar una variable no es una operación atómica, que requiere los siguientes pasos:
1.
Cargue un valor de una variable de instancia en un registro.
2.
Incrementar o reducir el valor.
3.
Almacene el valor en la variable de instancia.
Si no usa Incrementar y Disminuir, un hilo puede ser reemplazado después de ejecutar los dos primeros pasos. Luego, otro hilo puede ejecutar los tres pasos. Cuando el primer subproceso reanuda la ejecución, sobrescribe el valor en la variable de instancia y se pierde el efecto del incremento o decremento realizado por el segundo subproceso.
El método Exchange intercambia atómicamente los valores de las variables especificadas. El método CompareExchange combina dos operaciones: comparar dos valores y almacenar un tercer valor en una de las variables, según el resultado de la comparación. Las operaciones de comparación e intercambio se realizan como una operación atómica.
Ejemplos
El siguiente ejemplo de código muestra un mecanismo de bloqueo de recursos seguro para subprocesos.
VB
C #
C ++
F #
JScript
Copiar
importaciones Importaciones del sistema
System.Threading
Espacio de nombres InterlockedExchange_Example
Clase MyInterlockedExchangeExampleClass
'0 para falso, 1 para verdadero.
Privado Compartido 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)
'Espere una cantidad aleatoria de tiempo antes de comenzar el siguiente hilo.
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 ()
'Espere 1 segundo antes del próximo intento.
Thread.Sleep (1000)
Next I
End Sub
'Un método simple que niega la reentrada.
Función compartida UseResource () Como booleano
'0 indica que el método no está en uso.
Si 0 = Interlocked.Exchange (usingResource, 1) Then
Console.WriteLine ("{0} adquirió el bloqueo", Thread.CurrentThread.Name)
'El código para acceder a un recurso que no es seguro para subprocesos iría aquí.
'Simular un
hilo de trabajo
.
Dormir (500)
Console.WriteLine ( "{0} Bloqueo de salir", Thread.CurrentThread.Name)
'Suelte el bloqueo
Interlocked.Exchange (usingResource, 0)
devuelven True
Else
Console.WriteLine ( "{0} se le negó la cerradura", Thread.currentThread .Name)
Devuelve False
End If
End Función
End Class
End Espacio de nombres