什么情景下应该考虑 多线程 编程来解决问题
2014-05-09 16:35
726 查看
什么情景下应该考虑多线程编程来解决问题
一、为什么使用多线程优于多进程:
1.创建一个线程比创建一个进程的代价要小;
2.线程的切换比进程间的切换代价小 ;
3.多线程可以充分利用多核处理器或多处理器 ;
[b] 请注意,对于多核处理器而言,这些额外的核对自动加快程序的速度没有任何贡献。程序运行的时间将与它们在上一代硬件上的运行时间相同,除非,你编写程序时刻意利用这些额外的核。如果你的程序有高度的并发性,从而能同时运行在多个核上,把运行程序的核增加一倍就可让程序的速度提高一倍。但你必须以一种不同的方式来写程序,而不再像编写标准的顺序程序那样,你需要让你自己的程序主动利用并发性。[/b]
4.线程间的通信比进程间的通信代价要小的多;
4.1数据共享 :数据共享使得线程之间的通信比进程间的通信更高效;
4.2快速响应特性 :在系统繁忙的情况下,进程通过独立的线程及时响应用户的输入;
二、线程的几种状态
1. 就绪(ready):线程等待可用的处理器。
2. 运行(running):线程正在被执行。
3. 阻塞(blocked):线程正在等待某个事件的发生(比如I/O的完成,试图加锁一个被上锁的互斥量)。
4. 终止(terminated):线程从起始函数中返回或者调用pthread_exit。
三、什么情景下应该考虑多线程编程来解决问题?
1.为功能而线程化
分配不同的线程来完成应用程序的不同功能,这是最容易的方法,因为功能重叠的机会很罕见。 在一个应用程序中控制并发功能的执行是比较容易的。 即使在计算间没有直接的影响,功能之间的依赖性还会维持。
多线程应用举例:为了简化代码,为下列部分设计不同的线程:输入、图形用户界面、计算和输出。
2.为性能而线程化
通过将执行在并行环境下的大量的计算分解开来进行应用程序的并行化,能够提高计算的性能。线程化是为了改善周转周期和吞吐量 。
比如: 搜索太空实验室碎片, 把全部搜索区域分成多个分段,并安排一个工人去搜索一个分段 。
2.1为缩短周转周期而线程化
用可能的最小的时间完成一个任务
举例:安排一个饭桌时候的不同任务:
一个侍者摆放盘子。
一个侍者折叠和放置餐巾。
一个侍者摆放花和蜡烛。
一个侍者摆放器皿、汤匙、刀子和叉子
一个侍者放玻璃杯
2.2为了吞吐量而线程化
在固定的时间内完成最多的任务
举例:安排一个饭局时候的不同任务
对多个侍者的安排: 每个桌子安排一个侍者。 一个侍者能摆放所有桌子的所有盘子;另一个可以摆放所有的玻璃杯;以此类推。
一、为什么使用多线程优于多进程:
1.创建一个线程比创建一个进程的代价要小;
2.线程的切换比进程间的切换代价小 ;
3.多线程可以充分利用多核处理器或多处理器 ;
[b] 请注意,对于多核处理器而言,这些额外的核对自动加快程序的速度没有任何贡献。程序运行的时间将与它们在上一代硬件上的运行时间相同,除非,你编写程序时刻意利用这些额外的核。如果你的程序有高度的并发性,从而能同时运行在多个核上,把运行程序的核增加一倍就可让程序的速度提高一倍。但你必须以一种不同的方式来写程序,而不再像编写标准的顺序程序那样,你需要让你自己的程序主动利用并发性。[/b]
4.线程间的通信比进程间的通信代价要小的多;
4.1数据共享 :数据共享使得线程之间的通信比进程间的通信更高效;
4.2快速响应特性 :在系统繁忙的情况下,进程通过独立的线程及时响应用户的输入;
二、线程的几种状态
1. 就绪(ready):线程等待可用的处理器。
2. 运行(running):线程正在被执行。
3. 阻塞(blocked):线程正在等待某个事件的发生(比如I/O的完成,试图加锁一个被上锁的互斥量)。
4. 终止(terminated):线程从起始函数中返回或者调用pthread_exit。
三、什么情景下应该考虑多线程编程来解决问题?
1.为功能而线程化
分配不同的线程来完成应用程序的不同功能,这是最容易的方法,因为功能重叠的机会很罕见。 在一个应用程序中控制并发功能的执行是比较容易的。 即使在计算间没有直接的影响,功能之间的依赖性还会维持。
多线程应用举例:为了简化代码,为下列部分设计不同的线程:输入、图形用户界面、计算和输出。
2.为性能而线程化
通过将执行在并行环境下的大量的计算分解开来进行应用程序的并行化,能够提高计算的性能。线程化是为了改善周转周期和吞吐量 。
比如: 搜索太空实验室碎片, 把全部搜索区域分成多个分段,并安排一个工人去搜索一个分段 。
2.1为缩短周转周期而线程化
用可能的最小的时间完成一个任务
举例:安排一个饭桌时候的不同任务:
一个侍者摆放盘子。
一个侍者折叠和放置餐巾。
一个侍者摆放花和蜡烛。
一个侍者摆放器皿、汤匙、刀子和叉子
一个侍者放玻璃杯
2.2为了吞吐量而线程化
在固定的时间内完成最多的任务
举例:安排一个饭局时候的不同任务
对多个侍者的安排: 每个桌子安排一个侍者。 一个侍者能摆放所有桌子的所有盘子;另一个可以摆放所有的玻璃杯;以此类推。
相关文章推荐
- C++ 多线程编程解决CPU占用率高问题
- 解决 “VC++ 多线程编程,win32,MFC 例子(转)”在高版本上运行有错误的问题
- C#多线程之三:解决多线程编程中大并发数等待唤醒的问题
- 关于手机游戏的问题!像这样的应该用什么解决??
- C#多线程之解决多线程编程中大并发数等待唤醒的问题
- 做企业集成应该考虑什么问题 (.NET / J2EE 视角)
- 网络编程三---多线程/进程解决并发问题
- 解决多线程编程中大并发数等待唤醒的问题
- C#多线程之三:解决多线程编程中大并发数等待唤醒的问题
- 流式计算strom,Strom解决的问题,实现实时计算系统要解决那些问题,离线计算是什么,流式计算什么,离线和实时计算区别,strom应用场景,Strorm架构图和编程模型(来自学习资料)
- 用JAVA多线程编程解决Lamport's Bakery问题
- 按如下函数原型用函数编程解决如下的日期转换问题(要求考虑闰年的问题): 输入某年某月某日,计算并输出它是这一年的第几天。 /* 函数功能: 对给定的某年某月某日,计算它是这一年的第几天 函数参数:
- 什么是高并发?与多线程有什么区别?你的项目有高并发问题吗?是如何解决的?
- 学编程,没什么的,就是编码量,解决问题的思路
- AOP(Aspect Oriented Programming)面向切面编程,aop解决的问题是什么(AOP模拟)
- C#多线程之三:解决多线程编程中大并发数等待唤醒的问题
- C++ 多线程编程解决CPU占用率高问题
- 多线程访问同一资源第二步 : 线程设置 以及 线程打印 用synchronized解决数据不匹配问题
- 如何实现多个线程同步 (2013-11-10 12:07:24)转载▼ 标签: it 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题,Java实现线程同步的方法很多
- 程序设计--浅谈编程解决实际问题的常见思想