线程池(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间移植的。
众所周知,线程并非越多越好,理论上一个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间移植的。
相关文章推荐
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
- 实现Spring整合线程池ThreadPoolTaskExecutor
- 线程池 (thread pool) 的类型与实现方式
- Spring中的线程池ThreadPoolTaskExecutor
- 简易线程池Thread Pool
- boost 中使用 线程池threadpool
- ThreadPool(线程池) in .Net(转)
- Android Thread Pool(线程池)
- 线程池-newFixedThreadPool、newCachedThreadPool、
- 多线程编程(3):线程池ThreadPool
- Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
- 用线程池(Thread Pool)实现异步执行程序
- jetty的线程池实现QueuedThreadPool
- ThreadPool(线程池)
- 关于python线程池threadpool
- ExecutorService常用方法和newFixedThreadPool创建固定大小的线程池
- Extended Thread Pool(可扩展的线程池)
- MinerThreadPool.java 线程池
- newCachedThreadPool线程池