锁对多线程性能的影响

时间:2017-11-16 06:08:08

标签: c# multithreading performance locking

我有一个简单的类,旨在解决线程问题。它有一个成员变量num,它被初始化为0,还有一个名为modify的方法,它递增然后递减num次。当程序运行时,它会创建两个运行修改的线程,然后启动一个计时器并启动线程。它使用while循环等待两个线程完成执行,然后停止计时器并将经过的时间打印到控制台。上课:

public class Threading
{

    public static void Main()
    {
        Threading t = new Threading();
        t.demo();
    }

    private int num = 0;

    public void doThreading()
    {

        Thread t1 = new Thread(modify);
        Thread t2 = new Thread(modify);

        t1.Start();
        t2.Start();

        Stopwatch timer = new Stopwatch();
        timer.Start();

        while (thread1.IsAlive || thread2.IsAlive)
        {

        }

        timer.Stop();
        Console.WriteLine("Took: " + timer.ElapsedMilliseconds + " milliseconds");

        Console.Read();
    }

    public void modify()
    {
        for (int i = 0; i < 1000000000; i++)
        {
            count++;
            count--;
        }
    }
}

运行程序后,由于竞争条件,num不会为0。当我向modify方法添加锁,以便在运行程序后num为0:

public void modify()
    {
        for (int i = 0; i < 1000000000; i++)
        {
            lock (this) { count++; }
            lock (this) { count--; }
        }
    }

然后程序执行的时间是8倍。我无法弄清楚为什么它会花费这么长时间,我希望,最多只需要4倍的执行时间。知道为什么要花这么长时间吗?

1 个答案:

答案 0 :(得分:0)

在这种情况下,

lock似乎非常昂贵(您只需锁定递增int,即make count++ 原子);改为使用Interlocked

public void modify()
{
    for (int i = 0; i < 1000000000; i++)
    {
        Interlocked.Increment(ref count);
        Interlocked.Decrement(ref count); 
    }
}