什么情景下应该考虑多线程编程来解决问题
一、为什么使用多线程优于多进程:
1.创建一个线程比创建一个进程的代价要小;
2.线程的切换比进程间的切换代价小 ;
3.多线程可以充分利用多核处理器或多处理器 ;
请注意,对于多核处理器而言,这些额外的核对自动加快程序的速度没有任何贡献。程序运行的时间将与它们在上一代硬件上的运行时间相同,除非,你编写程序时刻意利用这些额外的核。如果你的程序有高度的并发性,从而能同时运行在多个核上,把运行程序的核增加一倍就可让程序的速度提高一倍。但你必须以一种不同的方式来写程序,而不再像编写标准的顺序程序那样,你需要让你自己的程序主动利用并发性。
4 .线程越多越好吗?什么时候才有必要用多线程?
线程必然不是越多越好,线程切换也是要开销的,当你增加一个线程的时候,增加的额外开销要小于该线程能够消除的阻塞时间,这才叫物有所值。
Linux自从2.6内核开始,就会自动把不同的线程交给不同的核心去处理。Windows也从NT.4.0开始支持这一特性。
5.线程间的通信比进程间的通信代价要小的多;
5.1数据共享 :数据共享使得线程之间的通信比进程间的通信更高效;
5.2快速响应特性 :在系统繁忙的情况下,进程通过独立的线程及时响应用户的输入;
二、线程的几种状态
1. 就绪(ready):线程等待可用的处理器。
2. 运行(running):线程正在被执行。
3. 阻塞(blocked):线程正在等待某个事件的发生(比如I/O的完成,试图加锁一个被上锁的互斥量)。
4. 终止(terminated):线程从起始函数中返回或者调用pthread_exit。
三、什么情景下应该考虑多线程编程来解决问题?
1.为功能而线程化
分配不同的线程来完成应用程序的不同功能,这是最容易的方法,因为功能重叠的机会很罕见。 在一个应用程序中控制并发功能的执行是比较容易的。 即使在计算间没有直接的影响,功能之间的依赖性还会维持。
多线程应用举例:为了简化代码,为下列部分设计不同的线程:输入、图形用户界面、计算和输出。
2.为性能而线程化
通过将执行在并行环境下的大量的计算分解开来进行应用程序的并行化,能够提高计算的性能。线程化是为了改善周转周期和吞吐量 。
比如: 搜索太空实验室碎片, 把全部搜索区域分成多个分段,并安排一个工人去搜索一个分段 。
2.1为缩短周转周期而线程化
用可能的最小的时间完成一个任务
举例:安排一个饭桌时候的不同任务:
一个侍者摆放盘子。
一个侍者折叠和放置餐巾。
一个侍者摆放花和蜡烛。
一个侍者摆放器皿、汤匙、刀子和叉子
一个侍者放玻璃杯
2.2为了吞吐量而线程化
在固定的时间内完成最多的任务
举例:安排一个饭局时候的不同任务
对多个侍者的安排: 每个桌子安排一个侍者。 一个侍者能摆放所有桌子的所有盘子;另一个可以摆放所有的玻璃杯;以此类推。