25.8 Reasons to Use Threads 使用线程的理由

使用线程是出于三方面的理由:

● 可以使用线程将代码同其他代码隔离。这将提高你的应用程序的可靠性。事实上,这也是为什么Windows在OS中引入线程概念的原因。Windows之所以需要线程来获得可靠性,是因为你的应用程序对于操作系统来说是第三方组件,而Microsoft不会在你发布应用程序之前对这些代码的质量进行验证。但在发布前,你应该自行测试自己的所有应用程序。另外,由于你已经测试了完整的应用程序,所以应该知道它们是健壮和高质量的。由于你的应用程序对健壮性的要求没有操作系统对健壮性的要求高,所以你的应用程序不应出于维持健壮性的目的而使用太多的线程。如果你的应用程序支持加载由其他厂商生成的组件,那么应用程序对健壮性的要求就会提高,使用将线程有助于满足这个需求。

● 可以使用线程来简化编码。有的时候,如果通过一个任务自己的线程来执行该任务,编码会变得更简单。但是,如果这样做,肯定要使用额外的资源,代码也不是十分“经济”。现在,即使要付出一些资源作为代价,我也宁愿选择更简单的编码过程,否则干脆坚持一直用机器语言写程序好了,完全没有必要成为一名C#开发人员。但有的时候,一些人在使用线程时,觉得自己选择了一种更容易的编程方式,但实际上,他们是将事情(和它们的代码)大大地复杂化了。通常,在你引入线程时,引入的是要相互协作的代码,它们可能要求线程同步构造知道另一个线程在什么时候终止。一旦开始涉及协作,就要使用更多的资源,同时会使代码变得更复杂。所以,在开始使用线程之前,务必确定线程真的能帮到你。

● 可以用线程来实现并发执行。只有知道你自己的应用程序要在多CPU机器上运行,那么让多个任务同时运行,就能提高性能。现在,安装了多个CPU(或者一个多核CPU)的机器相当普遍,所以设计应用程序来使用多个内核是有意义的,这将是第26章和第27章的主题。

现在我想和你分享一下我的看法。每台计算机其实都有一个无比强大的资源:就是CPU。如果一个人在计算机上花钱,那么这台计算机应该24小时工作。换句话来说,我认为计算机中的所有CPU的使用率都应该一直保持在100%。但是有两个情况例外:第一种情况是,当你的计算机电量不足的时候;第二种情况是,数据中心更希望10台50% 使用率的计算机也不要5台100% 使用率的计算机,那样散热太多。

如果你同意我的看法,那么下一步是决定应该让CPU 适宜做什么。在我告诉你我的想法之前,我先说点别的。以前,开发人员和用户总是觉得计算机不够强大。因此,我们开发人员就不会让代码执行,除非用户通过UI元素给开发人员权限,允许应用程序开始消耗CPU资源。

现在不同了,计算机有着非常强大的计算能力,而且在不久的将来计算能力将变得更加强大。在这章的前面部分,我已经向你展示了如何通过“任务管理器”查看的我的CPU使用率。如果我的计算机用的是四核CPU,而不是现在双核,那么“任务管理器”会在更多的时间里报告0%的使用率。当80核的处理器出来的时候,我们的计算机会看起来很空闲。对于计算机的购买者来说,这感觉就像花了更多的的钱去买了更强大的CPU,但计算机做的工作变得越来越少!

这也是硬件厂商销售困难的原因:软件没有充分的利用硬件,用户没有从额外CPU中获益。我认为,现在的计算能力有很大的富余,而且富余的程度还会越来越大,所以开发者应该大胆的消费它。是到改变思路的时候了——过去,除非最终用户确定想要获得一个计算结果,否则我们根本不敢执行这个计算。但现在有了额外的计算能力,所以开发人员完全可以变得更大胆。

请看下面这个例子:当你在VS的编辑器中停止编辑的时候,VS会自动运行编译器并编译你的代码。这提高了开发者的生产效率,因为它们能在输入的时候看到源代码的警告和错误,并可立即修正问题。实际上,传统的“编辑—生成—调试”模式会逐渐变成“编辑—调试”模式,因为生成(编译)代码一直都在发生。作为用户,你是注意不到这一点的,因为还有大量CPU能力可供使用,而且编译器的频繁运行一般不会影响到你正在做的其他事情。事实上,我希望在VS未来的版本中,将“生成”菜单完全拿掉,因为这个过程变得完全自动化。这不仅使应用程序的UI变得更简单,而且应用程序能自动向用户提供“答案”,使他们的开发效率变得更高。

如果我们移除像菜单项这样的UI元素后,计算机对用户来说会变得更加简单。他们面对的选项变得更少,需要识别和理解的概念也变得更少。是多核革命使我们能移除这些UI元素,进而使软件变得更简单,使我的奶奶有一天也能舒舒服服地使用计算机。对于开发人员,移除UI元素之后,所需的测试次数一般会变得更少。另外,向用户提供更少的选项,可以简化编码。如果需要对UI元素和文档进行本地化(就像Microsoft那样),那么移除UI元素意味着需要写的文档变少了,也不需要再对减少的文档进行本地化。这一切能为你的公司节省大量时间和金钱。

下面是一些主动消费CPU能力的例子:文档拼写检查和语法检查、电子表格重新计算、磁盘文件索引以提高搜索速度以及硬盘碎片整理以提升I/O性能。

我想生活在一个精简的UI世界里。我想有更多的屏幕空间来显示我实际处理的数据。应用程序应主动提供更多的信息来帮助我快速和高效地完成工作,而不是每次都由我自己告诉应用程序去获取信息。过去这几年,硬件在那里静静地等待着软件开发人员去发掘它们的潜力。现在,软件是时候开始创造性地使用硬件了!

转载于:https://www.cnblogs.com/TivonStone/archive/2010/09/10/1823643.html

CLR_via_C#.3rd 翻译[25.8 使用线程的理由]相关推荐

  1. CLR_via_C#.3rd 翻译[25.9 线程调度和优先权]

    25.9 Thread Scheduling and Priorities 线程调度和优先权 抢占式(preemptive)操作系统必须使用某种算法,来决定在什么时候调度哪些线程以及调度多长时间.本节 ...

  2. CLR_via_C#.3rd 翻译[1.5 本地代码生成工具NGen.exe]

    1.5 The Native Code Generator Tool: NGen.exe 本地代码生成工具NGen.exe NGen.exe是和.NET框架绑定在一起的.当用户的机器上安装了一个应用程 ...

  3. 【翻译】深入浅出.NET线程系列之一:.NET线程介绍

    原文标题:Beginners Guide To Threading In .NET Part 1 of N --Introduction into threading in .NET 原文作者:Sac ...

  4. 《WCF技术内幕》翻译25:第2部分_第5章_消息:创建一个消息(下)之MessageFault

    Message和SOAP Fault老徐备注1 Message类型定义了一些用来创建表示SOAP Fault消息对象的工厂方法.SOAP Fault是SOAP消息的一种形式,它用来表示错误信息.在SO ...

  5. 区块链工程师平均薪资 25~50k?6 个理由告诉你为什么要懂区块链!

    作者 | Carol 出品 | 区块链大本营(blockchain_camp) 如果说有一个什么领域,能让中科院.华为.腾讯.京东.360.微众银行的大咖汇聚在一起,那一定是--区块链. 悄咪咪地给大 ...

  6. [CLR via C#]25. 线程基础

    原文:[CLR via C#]25. 线程基础 一.Windows为什么要支持线程 Microsoft设计OS内核时,他们决定在一个进程(process)中运行应用程序的每个实例.进程不过是应用程序的 ...

  7. Java线程状态及 wait、sleep、join、interrupt、yield等的区别

    Java中的线程状态(详见Java线程状态及转换-MarchOn): wait:Object类的实例方法,释放CPU执行权,进入等待状态,直到  被中断.被拥有该对象锁的线程唤醒(notify或not ...

  8. JVM调优之jstack找出最耗cpu的线程并定位代码

    jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多.下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有 ...

  9. 前端的请求最大线程数是多少啊_面试官:创建多少个线程合适,我该怎么说?...

    转载:https://mp.weixin.qq.com/s/j5d4Jtxo0RgJWgpnG9HxlQ 为什么要使用多线程? 防止并发编程出错最好的办法就是不写并发程序 既然多线程编程容易出错,为什 ...

  10. java 线程怎么写_面试问我,创建多少个线程合适?我该怎么说

    | 如果好看,请给个赞 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想If you can NOT explain it simply, you do NOT understand it ...

最新文章

  1. PyTorch数据加载处理
  2. ScriptManager.RegisterStartupScript方法和Page.ClientScript.RegisterStartupScript() 区别
  3. Java多线程编程的常见陷阱
  4. 基于SQLite+EF6实现一套自己的Key-Value存储管理工具包(1)
  5. P4051-[JSOI2007]字符加密【SA】
  6. win2008无法用计算机名共享,Windows Server 2008 R2中文件共享
  7. EntityFramework进阶——Entity Splitting和Table Splitting
  8. 作者:陈振冲(1959-),男,博士,香港理工大学学务长,电子计算学系教授...
  9. hdu2587(递推)
  10. 使用 Python 学习和破解古典密码
  11. 微信小程序九宫格抽奖和转盘抽奖的实现
  12. python学习手册笔记
  13. all country运营商APN接入点名称
  14. office 2019 visio 2016安装
  15. “AI超人”李开复慢下来的投资节奏
  16. sql查询各科成绩前三名----详述过程,思路清晰不烧脑
  17. 什么是线速路由器 线速转发
  18. Qt5:error: no matching function for call to 'MainWindow::connect()
  19. 计算机211应届毕业生薪资,毕业生“薪酬”最高的4所211大学,985大学的学生只能羡慕!...
  20. 腾讯云 - OCR-身份证识别

热门文章

  1. HyperLedger Composer升级fabric链码
  2. linux之VMware安装Centos7
  3. mysql MyISAM和InnoDB
  4. 十一、Oracle学习笔记:高级关联查询
  5. MAC 开发环境搭建及工具
  6. 阶段3 3.SpringMVC·_05.文件上传_1 文件上传之上传原理分析和搭建环境
  7. 读过的书,记录一下,不要忘记提高自己
  8. Java与算法之(2) - 快速排序
  9. 减小服务器负担,Apache启用mod_expires模块
  10. Spring Framework 官方文档学习(一)介绍