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,加减处不平滑。

  • 相关阅读:
    UIWebView控件中 字体大小和字体样式的修改
    IOS statusBarStyle 设置
    SSZipArchive解压失败的原因
    uiimageview 的 animation 动画
    App网络管理
    系统日志输出工具类
    软键盘管理
    获取App应用信息
    Activity管理类
    SharePreference工具类
  • 原文地址:https://www.cnblogs.com/wanjinliu/p/12270872.html
Copyright © 2011-2022 走看看