zoukankan      html  css  js  c++  java
  • 线程的效率和锁

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

    在系统支持(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,加减处不平滑。

  • 相关阅读:
    cocos2d-x CCNotificationCenter一个优化想法
    【备忘】尾调用(尾递归)--来自维基百科
    [转] 关于Mongodb的全面总结,学习mongodb的人,可以从这里开始
    [转]编程修养
    DirectX11 SDK 例程报错解决方法
    unity3d Vector3.Lerp解析
    unity3d 三分钟实现简单的赛车漂移
    Unity 5.3.1 No Android/IOS module loaded
    unity3d 音频无缝循环
    unity3d 扩展NGUI Tweener —— TweenTime
  • 原文地址:https://www.cnblogs.com/wanjinliu/p/12270872.html
Copyright © 2011-2022 走看看