一、基本的实现模型:
线程池的实现模型主要有两种:
1、半同步/半异步模型
在这种模型中,一个侦听线程负责接受请求,并在某个队列中缓冲它们。另外一组工作者线程负责处理请求。因此接受请求的线程并不是处理请求的线程。
2、领导者/跟随者模型
在这种模型中,有一个线程是领导者,其余线程是线程中的跟随者。当请求到达时,领导者首先获取请求,并在跟随者中选取一个作为新的领导者,然后继续处理请求。因此接受请求的线程就是处理请求的线程。
二、半同步/半异步模型
在这种模型中,线程池划分成三个不同的层次:
异步层,负责接受异步请求
排队层,对请求进行缓冲
同步层,多个阻塞在排队层上的处理线程
一般的半同步/半异步模型会有一个manager线程用于请求消息转发和调度,和一组worker线程构成线程池由manager来统一调度。
下面是一个半同步/半异步模型的示例,代码摘自APG范例threadpool.cpp,在ACE的源代码发布包中可以找到。下面的代码增加了相关注释,调整了缩进以便于阅读。范例中主要使用ACE一下几个类:ACE_Task,ACE_Message_Block,ACE_Condition,ACE_Unbounded_Queue。
在这个例子中,异步层被实现为ACE_Task类的子类Manager,它负责在它的底层消息队列上接受请求。
工作者线程有Worker实现,它也是ACE_Task的子类。
首先看Manager类的实现:
{
public :
enum {POOL_SIZE = 5 , MAX_TIMEOUT = 5 };
Manager ()
: shutdown_( 0 ), workers_lock_(), workers_cond_(workers_lock_)
{
ACE_TRACE (ACE_TEXT ( " Manager::Manager " ));
}
/* 线程处理函数 */
int svc ( void )
{
ACE_TRACE (ACE_TEXT ( " Manager::svc " ));
ACE_DEBUG ((LM_INFO, ACE_TEXT ( " (%t) Manager started " )));
// Create pool.
create_worker_pool ();
while ( ! done ())
{
ACE_Message_Block * mb = 0 ;
ACE_Time_Value tv (( long )MAX_TIMEOUT);
tv += ACE_OS::time ( 0 );
// Get a message request.
if ( this -> getq (mb, & tv) < 0 )
{
shut_down ();