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

在系统支持(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”对资源进行锁定可以杜绝很多不可控的情况。比如下面的代码:

 1 class Program
 2     {
 3         static balance b1;
 4         static int f;
 5         static void Main(string[] args)
 6         {
 7             b1 = new balance();
 8             b1.b = 1000;
 9             Thread t1 = new Thread(new ThreadStart(add));
10             Thread t2 = new Thread(new ThreadStart(sub));
11             f = 1;
12             t1.Start();
13             t2.Start();
14             Console.Read();
15         }
16         public static void add()
17         {
18             for (int i = 0; i < 1000; i++)
19             {
20                 //lock (b1)
21                 {
22                     if (f == -1)
23                     {
24                         Console.Write("add\n");
25                         f = 1;
26                     }
27                     Console.Write(++b1.b + ",");
28                 }
29             }
30         }
31         public static void sub()
32         {
33             for (int i = 0; i < 1000; i++)
34             {
35                 //lock (b1)
36                 {
37                     if (f == 1)
38                     {
39                         Console.Write("sub\n");
40                         f = -1;
41                     }
42                     Console.Write(--b1.b + ",");
43                 }
44             }
45         }
46     }
47     class balance
48     {
49         public int b;
50     }

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

02-14 04:33