当前位置: 首页 > news >正文

.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/archive/2012/01/09/2316805.html

相关文章:

  • ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第六篇:拦截器
  • 关于lync安装问题
  • Android SurfaceView
  • 明晰Silverlight中的依赖属性
  • rc.local自启动学习
  • Qt游戏编程_02
  • 超级终端使用简介
  • 粘包、丢包及TCP信息收发
  • 超前引用
  • Java中的volatile关键字-转载
  • jsp---EL存取器
  • 如何可以导入注册表文件时不提示?
  • 第八章异常和断言
  • VC++播放音频文件和音频数据的方法
  • ubuntu ftp服务器配置(转)
  • [NodeJS] 关于Buffer
  • [译] 怎样写一个基础的编译器
  • 11111111
  • 30天自制操作系统-2
  • Angular 响应式表单之下拉框
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Codepen 每日精选(2018-3-25)
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • eclipse的离线汉化
  • ES6系列(二)变量的解构赋值
  • flask接收请求并推入栈
  • java8-模拟hadoop
  • Laravel 实践之路: 数据库迁移与数据填充
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于for循环的简单归纳
  • 七牛云假注销小指南
  • 前端之Sass/Scss实战笔记
  • 微信支付JSAPI,实测!终极方案
  • 源码安装memcached和php memcache扩展
  • #大学#套接字
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (floyd+补集) poj 3275
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (三)mysql_MYSQL(三)
  • (转)大道至简,职场上做人做事做管理
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET MVC 验证码
  • .NET 使用 XPath 来读写 XML 文件
  • .NET简谈设计模式之(单件模式)
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /bin/rm: 参数列表过长"的解决办法
  • /etc/sudoers (root权限管理)
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @private @protected @public
  • @synthesize和@dynamic分别有什么作用?
  • [ SNOI 2013 ] Quare