ASP.NET温故而知新学习系列之ASP.NET中的多线程编程—1-线程机制

来源:互联网 发布:kc免费网络电话软件 编辑:程序博客网 时间:2024/05/16 07:07
       线程概念

  线程是程序执行的基本原子单位,我们上学的时候学过一个分子包括无数个原子,而原子是不能在分割的,原子是最小的单位,一个进程可以由多个线程来组成,解放战争中有好多战役比如淮海战役,淮海战役中有很多小的战斗组成的,我们可以把战役看做进程,而战役中很多小的战斗看做线程,从这个角度来看,为什么会提高效率呢,把一个进程分成好多线程,把一个战役分成好多小的战斗来组成,让它们并发异步执行来提高运行的效率,同时两个战斗同时打响,并发执行并不是同时执行(占用CPU),因为CPU某个时间段只能运行一个程序的,就是说海海战役有一个总的指挥司令部,这个总的指挥司令部在一个时间段上只能指挥一场战斗的,当同时两个战斗开始的时候,在某个时间点上只能指挥一场战斗,但是可以交叉指挥,所以从表面上看这两场战斗是同时打响的,也就是说,一个时间点只能一个线程占用CPU,只不过它们争夺CPU(相当于交叉指挥),感觉像同时运行一样。

  进程举例

  假设现在有个任务,一个是任务一炸掉敌人的炮兵营,分为三个步骤的战斗才能完成A1:找到炮兵营地图,B1:潜伏至敌人营地,C1:炸掉炮兵营,任务二是端掉敌人的高地,也分为三个步骤的战斗才能完成A2:找到高地死角,B2:阻击手潜伏至敌人高地死角,C2:阻击敌人。假设每一个步骤需要10分钟。

  如果同步执行的话

  假设这第一个任务和第二个任务都要用到机关枪,那么当任务一执行的时候,第二个任务需要等待,因为需要用到机关枪,没机关枪完成不了的,那么这两个任务必须得一个等待了,交给我机关枪我才能进行,两个任务共需要1个小时,因为它们需要的是一个资源。

  如果异步执行的话

  假设这第一个任务和第二个任务各自要用到不同的工具,那么它们不需要彼此的等待,并发执行,只需要30分钟就能完成。

  所以很明显第二种异步执行效率更高一些。

  

   什么时候用线程?

  假设两个任务都要用到一个资源,比如都要访问文件,IO输出,就不要用异步线程执行了,因为它们会同时抢占IO资源,会导致整个程序的效率会降低,它们在并发执行的时候会同时争夺某个资源比如说CPU,在这种情况下,CPU要不断的执行一些算法到底哪个线程的优先级高会消耗时间的,但是如果使用的资源比较均匀的,一个是使用IO输出,一个没有使用IO,就可以使用异步并发执行了,就是同时执行。

  如果两个任务用到的不是一个资源,可以用异步线程执行。

  我们一边下载文件,一边听音乐看似同时执行,但是实际上一个时间点上CPU只能运行一个任务,但是在大的时间段内看似同时运行一样。

  使用线程的缺点

  1:因为要保存每一个线程的上下文信息会使用到内存,会受到内存限制的问题

  2:跟踪大量的线程将占用大量的处理器时间