您的位置:首页 > 其它

线程池(Thread Pool)

2009-08-19 23:23 525 查看
烽驿2009开源实时通信平台 源码获取:svn checkout http://fy2009.googlecode.com/svn/trunk/ fy2009-read-only

众所周知,线程并非越多越好,理论上一个CPU(或Core)一个活动线程可获得最佳性能。线程池可根据具体硬件的情况(如CPU或Core的数量)配置一个适当的线程数,从而将系统性能调到最佳,因此在可伸缩多线程Server编程中常被

采用。
下面简要介绍本项目中的线程池(thread_pool_t)的实现:
线程池没有被实现成Singleton,这意味着一个进程可存在多个线程池用于不同的目的。通过调用
sp_tpool_t thread_pool_t::s_create(uint16 pool_size,
event_slot_t *msg_es_notfull, uint16 msg_esi_notfull,
uint32 msg_pipe_size,
uint32 trace_pipe_size,
uint32 trace_max_queued_size,
uint32 aioep_size,
uint16 max_fd_count)
创建线程池时可指定pool_size(线程池中线程个数), msg_es_notfull和msg_esi_notfull为消息发送方指定的同步对象,每有一个消息被处理,该对象就被Signal,发送方可在用于投递消息的oneway pipe满时wait该对象,一旦oneway

pipe变得不满,wait将被唤醒,发送方此时应马上调用msg_proxy_t::post_msg发一个空消息,将可能堆积在发送方队列中的消息写到oneway pipe中; msg_pipe_size指定消息服务中的oneway pipe size, 大于零,则enable线程池中所有线

程的消息服务; trace_pipe_size类似msg_pipe_size,大于零将enable日志服务, trace_max_queued_size 指定每个线程在写日志过快,而引起写日志线程来不及处理时,允许堆积的Trace条数; aioep_size指定异步IO的oneway pipe size,

大于零将Enable异步IO服务, max_fd_count指定异步IO服务可管理的最大句柄(如Socket)数。在线程池中通常消息服务和日志服务总应被Enable,异步IO服务可根据线程池的用途决定是否需要激活。
值得注意的时,在上述s_create调用后,线程池实际上仍然是空的,并没有实际的线程被创建。实际线程创建被推迟到随后的线程分配。线程分配需调用
sp_thd_t assign_thd(uint16 *p_idx)
该函数优先寻找线程池中空闲的线程(包括未创建的,此时,将先创建再返回),如果没有任何线程空闲,将以Round-Robin方式轮转。
线程池中的单个线程对象继承自thread_t(http://blog.csdn.net/DreamFreeLancer/archive/2009/08/14/4448150.aspx),run函数负责循环处理接收到的消息(如果Enable了消息服务)和/或接收到的异步IO事件(如果Enable了异步IO服

务)如果消息服务或异步IO服务的heart_beat返回不是idle, 该线程将被标识为busy, 否则,被标识为“空闲”,并调用_on_idle函数,此函数将检查是否有待写的日志仍堆积在本线程中,该函数的超时参数被设成msg_proxy的

get_min_delay_interval()返回值的一半,有关原理参(http://blog.csdn.net/DreamFreeLancer/archive/2009/06/13/4266189.aspx)。
本线程池除了考虑到效率因素,为异步IO提供了特别实现外,为一般性编程任务只提供了基于消息的接口,即必需将应用逻辑写在消息处理器中,然后将消息发往分配好的线程中,由该线程调用消息处理器完成应用逻辑。
结束任务后可调用stop_all关闭线程池。
本线程池当然也是可在Windows和Linux间移植的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: