线程的效率和锁

线程是程序能够规划的最小运算单位。

在系统支持(cpu、操作系统等)的情况下,几项不冲突的任务(指不使用共享资源或互相等待结果)使用多线程可以提高程序的执行效率。

如下例:

class Program
    {
        static int sleeptime=1000, myvalue=100;
        static DateTime dt1,dt2;
        static void Main(string[] args)
        {
            Thread t1, t2;
            t1 = new Thread(new ThreadStart(add));
            t2 = new Thread(new ThreadStart(sub));
            dt1 = DateTime.Now;
            t1.Start();
            t2.Start();
            Thread.Sleep(3*sleeptime);
            Console.WriteLine("以下是单线程用时:");
            ///////////////////////////////////////
            dt1 = DateTime.Now;
            add();
            sub();
            dt2 = DateTime.Now;
            Console.WriteLine(dt2 - dt1);
            Console.ReadKey();
        }
        public static void add()
        {
            myvalue++;
            Thread.Sleep(sleeptime);
            Console.WriteLine(DateTime.Now - dt1);
        }
        public static void sub()
        {
            myvalue--;
            Thread.Sleep(sleeptime);
            Console.WriteLine(DateTime.Now - dt1);
        }
    }

同样的操作,两种不同的方式。前者多线程,后者是默认的单线程。程序执行结果如下:

 

 可以看到效率的明显差异。

当然,这中间还有资源切换带来的损耗。如果每个方法足够复杂,执行的时间足够长,相信结果应当是线性的。

如果程序对某一部分资源进行争夺,使用“lock”对资源进行锁定可以杜绝很多不可控的情况。比如下面的代码:

class Program
    {
        //因为lock只能锁定引用类型,所以这里用一个长度为1的一维数组来存放值。
        static int[] b= { 1000 };
        static int f;
        static void Main(string[] args)
        {
            Thread t1 = new Thread(new ThreadStart(add));
            Thread t2 = new Thread(new ThreadStart(sub));
            f = 1;
            t1.Start();
            t2.Start();
            Console.Read();
        }
        public static void add()
        {
            for (int i = 0; i < 1000; i++)
            {
                //lock (b)
                {
                    if (f == -1)
                    {
                        Console.Write("add
");
                        f = 1;
                    }
                    Console.Write(++b[0] + ",");
                }
            }
        }
        public static void sub()
        {
            for (int i = 0; i < 1000; i++)
            {
                //lock (b)
                {
                    if (f == 1)
                    {
                        Console.Write("sub
");
                        f = -1;
                    }
                    Console.Write(--b[0] + ",");
                }
            }
        }
    }

运行后可以发现:不使用lock,加减处不平滑。

原文地址:https://www.cnblogs.com/wanjinliu/p/12270872.html