Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Clase Interlocked

 

Publicado: octubre de 2016

Proporciona operaciones atómicas para las variables compartidas por varios subprocesos.

Espacio de nombres:   System.Threading
Ensamblado:  mscorlib (en mscorlib.dll)

System.Object
  System.Threading.Interlocked

public static class Interlocked

NombreDescripción
System_CAPS_pubmethodSystem_CAPS_staticAdd(Int32, Int32)

Agrega dos enteros de 32 bits y reemplaza el primer entero por la suma, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticAdd(Int64, Int64)

Agrega dos enteros de 64 bits y reemplaza el primer entero por la suma, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticCompareExchange(Double, Double, Double)

Compara dos números de punto flotante de precisión doble para comprobar si son iguales y, si lo son, reemplaza el primero de los valores.

System_CAPS_pubmethodSystem_CAPS_staticCompareExchange(Int32, Int32, Int32)

Compara dos enteros de 32 bits con signo para comprobar si son iguales y, si lo son, reemplaza el primer valor.

System_CAPS_pubmethodSystem_CAPS_staticCompareExchange(Int64, Int64, Int64)

Compara dos enteros de 64 bits con signo para comprobar si son iguales y, si lo son, reemplaza el primer valor.

System_CAPS_pubmethodSystem_CAPS_staticCompareExchange(IntPtr, IntPtr, IntPtr)

Compara dos identificadores o punteros específicos de plataforma para comprobar si son iguales y, si lo son, reemplaza el primero.

System_CAPS_pubmethodSystem_CAPS_staticCompareExchange(Object, Object, Object)

Compara dos objetos para comprobar si sus referencias son iguales y, si lo son, reemplaza el primero de los objetos.

System_CAPS_pubmethodSystem_CAPS_staticCompareExchange(Single, Single, Single)

Compara dos números de punto flotante de precisión sencilla para comprobar si son iguales y, si lo son, reemplaza el primero de los valores.

System_CAPS_pubmethodSystem_CAPS_staticCompareExchange<T>(T, T, T)

Compara dos instancias del tipo de referencia especificado T son iguales y, si lo son, reemplaza el primero.

System_CAPS_pubmethodSystem_CAPS_staticDecrement(Int32)

Disminuye el valor de una variable especificada y almacena el resultado, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticDecrement(Int64)

Disminuye el valor de la variable especificada y almacena el resultado, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticExchange(Double, Double)

Establece un número de punto flotante de precisión doble en un valor especificado y devuelve el valor original, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticExchange(Int32, Int32)

Establece un entero de 32 bits con signo en un valor especificado y devuelve el valor original, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticExchange(Int64, Int64)

Establece un entero de 64 bits con signo en un valor especificado y devuelve el valor original, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticExchange(IntPtr, IntPtr)

Establece un puntero o identificador específico de plataforma en un valor especificado y devuelve el valor original, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticExchange(Object, Object)

Establece un objeto en un valor especificado y devuelve una referencia al objeto original, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticExchange(Single, Single)

Establece un número de punto flotante de precisión sencilla en un valor especificado y devuelve el valor original, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticExchange<T>(T, T)

Establece una variable del tipo T especificado en un valor determinado y devuelve el valor original, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticIncrement(Int32)

Aumenta el valor de una variable especificada y almacena el resultado, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticIncrement(Int64)

Aumenta el valor de una variable especificada y almacena el resultado, como una operación atómica.

System_CAPS_pubmethodSystem_CAPS_staticMemoryBarrier()

Sincroniza el acceso a memoria de la siguiente forma: el procesador que ejecuta el subproceso actual no puede reordenar instrucciones de forma que la memoria tiene acceso antes de llamar a MemoryBarrier ejecuten después de los accesos a memoria que siguen a la llamada a MemoryBarrier.

System_CAPS_pubmethodSystem_CAPS_staticRead(Int64)

Devuelve un valor de 64 bits, cargado como una operación atómica.

Los métodos de esta clase ayudan a proteger contra los errores que pueden producirse cuando el programador cambia de contexto mientras un subproceso está actualizando una variable que puede obtenerse de otros subprocesos, o cuando dos subprocesos se están ejecutando simultáneamente en procesadores separados. Los miembros de esta clase no producen excepciones.

El Increment y Decrement métodos incrementar o disminuir la variable y almacene el valor resultante en una sola operación. En la mayoría de los equipos, el incremento de una variable no es una operación atómica y requiere los pasos siguientes:

  1. Cargar un valor de una variable de instancia en un registro.

  2. Incrementar o disminuir el valor.

  3. Almacenar el valor en la variable de instancia.

Si no se utilizan Increment y Decrement, un subproceso puede ser adelantado después de ejecutar los dos primeros pasos. Otro subproceso puede ejecutar los tres pasos. Cuando el primer subproceso reanuda la ejecución, se sobrescribe el valor de la variable de instancia y se pierde el efecto del aumento o reducción que realiza el segundo subproceso.

El Exchange método atómicamente intercambia los valores de las variables especificadas. El CompareExchange método combina dos operaciones: compara dos valores y almacena un tercer valor en una de las variables, en función del resultado de la comparación. Las operaciones de comparación e intercambio se realizan como una operación atómica.

En el ejemplo de código siguiente se muestra un mecanismo de bloqueo de recursos seguro para subprocesos.

using System;
using System.Threading;

namespace InterlockedExchange_Example
{
    class MyInterlockedExchangeExampleClass
    {
        //0 for false, 1 for true.
        private static int usingResource = 0;

        private const int numThreadIterations = 5;
        private const int numThreads = 10;

        static void Main()
        {
            Thread myThread;
            Random rnd = new Random();

            for(int i = 0; i < numThreads; i++)
            {
                myThread = new Thread(new ThreadStart(MyThreadProc));
                myThread.Name = String.Format("Thread{0}", i + 1);

                //Wait a random amount of time before starting next thread.
                Thread.Sleep(rnd.Next(0, 1000));
                myThread.Start();
            }
        }

        private static void MyThreadProc()
        {
            for(int i = 0; i < numThreadIterations; i++)
            {
                UseResource();

                //Wait 1 second before next attempt.
                Thread.Sleep(1000);
            }
        }

        //A simple method that denies reentrancy.
        static bool UseResource()
        {
            //0 indicates that the method is not in use.
            if(0 == Interlocked.Exchange(ref usingResource, 1))
            {
                Console.WriteLine("{0} acquired the lock", Thread.CurrentThread.Name);

                //Code to access a resource that is not thread safe would go here.

                //Simulate some work
                Thread.Sleep(500);

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

                //Release the lock
                Interlocked.Exchange(ref usingResource, 0);
                return true;
            }
            else
            {
                Console.WriteLine("   {0} was denied the lock", Thread.CurrentThread.Name);
                return false;
            }
        }

    }
}  

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 1.1
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Silverlight
Disponible desde 2.0
Windows Phone Silverlight
Disponible desde 7.0
Windows Phone
Disponible desde 8.1

Este tipo es seguro para la ejecución de subprocesos.

Volver al principio
Mostrar: