zoukankan      html  css  js  c++  java
  • .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. 跟踪大量的线程将占用大量的处理器时间 。

  • 相关阅读:
    LocalDB数据库修改排序规则,修复汉字变问号
    设计模式读书笔记-单件模式(创建型模式)
    supersocket实现上传文件
    一步一步架起MyBatis
    windows平台下cmake+gtest工程调试
    嵌入式Linux模块移植四部曲
    一次惊呆的调试经历
    阅读《大型网站技术架构》第五章、第六章心得
    阅读《大型网站技术架构》第四章心得
    阅读《大型网站技术架构》 第三章心得
  • 原文地址:https://www.cnblogs.com/menglin2010/p/2316805.html
Copyright © 2011-2022 走看看