Multi-hilo programación Learning Series --- clase Interlocked

Mira la pieza de código

class Program
{
    static void Main(string[] args)
    {
        var counter = new Counter();
        var t1 = new Thread(() => TestCount(counter));
        var t2 = new Thread(() => TestCount(counter));
        var t3 = new Thread(() => TestCount(counter));
        t1.Start();
        t2.Start();
        t3.Start();
        t1.Join();
        t2.Join();
        t3.Join();
        Console.WriteLine($"totalCount is {counter.Count}");

        var counterNoLock = new CounterNoLock();
        var t4 = new Thread(() => TestCount(counterNoLock));
        var t5 = new Thread(() => TestCount(counterNoLock));
        var t6 = new Thread(() => TestCount(counterNoLock));
        t4.Start();
        t5.Start();
        t6.Start();
        t4.Join();
        t5.Join();
        t6.Join();

        Console.WriteLine($"Interlocked totalCount is {counterNoLock.Count}");

        Console.ReadKey();
    }

    static void TestCount(CounterBase model)
    {
        for (int i = 0; i < 10000; i++)
        {
            model.Increment();
            model.Decrement();
        }
    }

}
//计数基类
abstract class CounterBase
{
    public abstract void Increment();
    public abstract void Decrement();
}

//计数类
class Counter : CounterBase
{
    private int _count;
    public int Count
    {
        get
        {
            return _count;
        }
    }

    public override void Increment()
    {
        _count++;
    }
    public override void Decrement()
    {
        _count--;
    }
}
//计数类
class CounterNoLock : CounterBase
{
    private int _count;
    public int Count
    {
        get
        {
            return _count;
        }
    }

    public override void Increment()
    {
        Interlocked.Increment(ref _count);
    }
    public override void Decrement()
    {
        Interlocked.Decrement(ref _count);
    }
}

Los resultados de
Aquí Insertar imagen Descripción
las obras
código de tiempo de ejecución que crea tres objetos método run TestCounter, el método de la subasta de ejecución u operación de decremento de un objeto, el objeto contador no es seguro para subprocesos, se encontrará con las condiciones de carrera, por lo que el resultado es el valor del primer ejemplo incierto, puede ser cero, o puede para otros.
Podemos resolver este problema mediante el bloqueo del objeto, pero esto hará que el otro hilo está bloqueado, y por medio de la clase Interlocked, se puede obtener el resultado correcto sin necesidad de bloquear un objeto, Interlocked proporciona un método derivado de las operaciones matemáticas básicas incrementar, decrementar, y añadir, etc. sin necesidad de utilizar la cerradura cuando para ayudarnos a volver a escribir la clase de contador.


Publicado 37 artículos originales · ganado elogios 3 · Vistas 6333

Supongo que te gusta

Origin blog.csdn.net/huan13479195089/article/details/88875352
Recomendado
Clasificación