以下内容转自http://ifeve.com/costs-of-multithreading/

从一个单线程的应用到一个多线程的应用并不仅仅带来好处,它也会有一些代价。不要仅仅为了使用多线程而使用多线程。而应该明确在使用多线程时能多来的好处比所付出的代价大的时候,才使用多线程。如果存在疑问,应该尝试测量一下应用程序的性能和响应能力,而不只是猜测。

设计更复杂

虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂。在多线程访问共享数据的时候,这部分代码需要特别的注意。线程之间的交互往往非常复杂。不正确的线程同步产生的错误非常难以被发现,并且重现以修复。

上下文切换的开销

当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行。这种切换称为“上下文切换”(“context switch”)。CPU会在一个上下文中执行一个线程,然后切换到另外一个上下文中执行另外一个线程。

上下文切换并不廉价。如果没有必要,应该减少上下文切换的发生。

你可以通过维基百科阅读更多的关于上下文切换相关的内容:

http://en.wikipedia.org/wiki/Context_switch

增加资源消耗

线程在运行的时候需要从计算机里面得到一些资源。除了CPU,线程还需要一些内存来维持它本地的堆栈。它也需要占用操作系统中一些资源来管理线程。我们可以尝试编写一个程序,让它创建100个线程,这些线程什么事情都不做,只是在等待,然后看看这个程序在运行的时候占用了多少内存。

最新文章

  1. Qt程序打包(使用Enigma Virtual Box和BoxedApp Packer封包)
  2. Qt学习笔记 QMessageBox
  3. windows下的文件到linux下乱码 iconv 修改文件编码
  4. ruby eclipse调试
  5. 观点:哪些人适合做FPGA开发?(转)
  6. 简单C#文字转语音
  7. C#操作Xml:通过XmlDocument读写Xml文档
  8. VM虚拟机的配置文件(.vmx)损坏修复
  9. nginx错误记录
  10. mysq开启慢查询
  11. C# TextBox 焦点
  12. 使用 GNU profiler 来提高代码运行速度
  13. c#源码的执行过程
  14. 19. Rootkit detectors (隐形工具包检测器 5个)
  15. 学习windows编程 day4 之视口和窗口
  16. [ntp]查看ntp服务器的连接情况
  17. Angularjs controller之间的通信
  18. ios的坑 无痕模式
  19. (转)Windows上使用CMake
  20. 028-applicationContext.xml配置文件

热门文章

  1. 407 Trapping Rain Water II 接雨水 II
  2. 240 Search a 2D Matrix II 搜索二维矩阵 II
  3. [ SPOJ Qtree1 ] Query on a tree
  4. JavaScript(十四)经典的Ajax
  5. 如何取消android studio启动时自动打开上次关闭的项目
  6. 介绍Git的17条基本用法
  7. 重构27-Remove God Classes(去掉神类)
  8. ubuntu服务器全部署
  9. Java基础——面向对象(封装——继承——多态 )
  10. ViewPager与fragment详解链接