.NET下的多线程编程—1线程机制概述

  阅读目录

  一:线程基本概念

  二:进程举例

  三:什么时候用线程?

  四:使用线程的缺点

  一:线程基本概念

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

    2. 线程是程序执行的基本原子单位,一个进程可以由多个线程组成。

    3.正确的使用线程能够很好地提高应用程序的性能和运行效率,实现机制是,把一个进程分成多个线程,然后让它们异步并发执行,来提高应用程序的性能和运行效率。

    4. 并发执行并不是同时执行(占用CPU),任意时刻还是只能有一个线程占用CPU,只不过它们争夺CPU频繁一些,感觉它们似乎同时在运行。

   二:进程举例

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

    1. 如果同步执行的话

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

    2. 如果异步执行的话

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

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

  

  三:什么时候用线程?

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

    2. 一般如果多个线程在执行时都要抢占某一个资源或者几个资源,就不要用并发异步执行了,因为它们是并发执行,很可能同时争夺某个资源,这时候那这个资源是给你呢,还是给他呢,那么这时候CPU就要执行资源分配算法,要判断哪个线程的优先级高,这是要花费时间的,打个比方早上起来上班,我们可以先用微波炉热牛奶,再去洗脸,这是两个并发的行为,可以同时执行,因为用到的是不同的资源,一个用到的是微波炉,一个用到的是水,如果要同时用微波炉热牛奶和热面包是不能同时进行的,要么先热牛奶,再热面包,要么先热面包,再热牛奶,不能并发执行,因为这两个行为用到了同一个资源,那就是都用到的是微波炉。

    3. 如果两个任务用到的不是一个资源,可以用异步线程执行,如果多个线程所需要的系统资源是均匀的,这时候可以让它们并发异步执行。

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

  四:使用线程的缺点

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

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

原文地址:https://www.cnblogs.com/menglin2010/p/2316805.html