线程池

来源:互联网 发布:空军知乎 编辑:程序博客网 时间:2024/05/19 17:56

http://www.ibm.com/developerworks/cn/java/l-threadPool/
http://www.cppblog.com/toMyself/archive/2010/09/22/127347.html


多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。

每个任务一个线程会使用系统限入"过度切换"和"过度开销"的泥潭。基于上面的技术,线程池将频繁创建和销毁线程所带来的开销分摊到了每个具体执行的任务上,执行的次数越多,则分摊到每个任务上的开销就越小。当然,如果线程创建销毁所带来的开销与线程执行任务的开销相比微不足道,可以忽略不计,则线程池并没有使用的必要。比如,FTP、Telnet等应用时。

线程池尺寸对于大量任务处理的效率有非常明显的提高,但是一旦尺寸选择不合理(过大或过小)就会严重降低影响服务器性能。理论上"过小"将出现任务不能及时处理的情况,"过大"则会出现线程间同步开销太大的问题,而且在线程间切换很耗CPU时间。


调整优化线程池尺寸是高级线程池要解决的一个问题。

主要有下列解决方案:

  • 方案一:动态增加工作线程
  • 方案二:优化工作线程数目
  • 方案三:一个服务器提供多个线程池
线程池的应用范围:

  • 需要大量的线程来完成任务,且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。 但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。
  • 对性能要求苛刻的应用,比如要求服务器迅速相应客户请求。
  • 接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情况下,将产生大量线程,虽然理论上大部分操作系统线程数目最大值不是问题,短时间内产生大量线程可能使内存到达极限,并出现"OutOfMemory"的错误。


boost:class thread; class thread_group;

ACE:


线程池尺寸对于大量任务处理的效率有非常明显的提高,但是一旦尺寸选择不合理(过大或过小)就会严重降低影响服务器性能。理论上"过小"将出现任务不能及时处理的情况,"过大"则会出现线程间同步开销太大的问题,而且在线程间切换很耗CPU时间。
原创粉丝点击