关于对多线程在什么情况下利大于弊的分析。(前10个发言者肯定有分)
temp 2001-05-20 02:38:00 我先发言:
为了提高CPU的利用率,为了保证程序的实时响应能力。我在这里使用了多线程技术,串口监视线程,数据分析线程,动态建立的数据处理线程可以‘同时’工作。注意,在单CPU的系统里,这样的‘同时’是一种错觉,实际上,还是多个线程轮流使用CPU。如前问所述,CPU的速度已经很快,系统效率的瓶颈不在CPU,而在串口和数据库服务器。所以,整个进程的效率会提高不少。
任何事物都有它的两面性,CPU在提高了系统‘通量’的同时。也带来了一些负面的影响,如果处理不好,会完全抵消使用多线程所带来的好处。
首先需要说明的是,使用多线程技术并不能节省CPU的操作,相反,系统还要在切换上下文中花一些时间。多线程只是提高了CPU的利用率而已。
加入额外的线程可以增加通量,但是加入过多的线程将会降低系统的性能,因为上下文交换将会成为一个重大的负担。上下文交换速度应该低的原因有两个:上下文交换占用了许多宝贵的时钟周期;更糟的是,上下文交换将处理器的缓存填满了没用的数据,替换这些数据可能是代价高昂的。
虽然Windows NT系统和Windows2000系统的稳定性可以承受系统内同时运行上千个线程,(我曾见过NT系统中运行1700个线程的时候)但是当线程开得过多的时候,将会出现整体运行效率大大降低的情况。因为,目前大多数的计算机都是单处理器(CPU)的,在这种机器上运行多线程程序,有时反而会降低系统的性能。如果两个非常活跃的线程为了抢夺对CPU的控制权,则在线程切换时会消耗很多的CPU资源,但对于大部分时间被阻塞的线程(例如等待文件I/O操作),则可用一个单独的线程来完成。这样,就可将CPU时间让出来,使程序获得更好的性能。因此,在设计多线程应用程序时,应慎重选择,并且视具体情况加以处理,使应用程序获得最佳的性能。
还可能有另一个问题也需要说明,动态的建立线程也需要花时间,但我确信这个时间比查一次数据库所花的时间要小的多。综合来看,在数据流量较大的情况下,还是利大于弊。所以我个人更倾向于使用多线程。