www.pudn.com > MyLinuxThread.rar > ThreadPool.cpp, change:2007-05-25,size:3083b
#include "ThreadPool.h"
#include "Log.h"
G_ThreadPool::G_ThreadPool(unsigned int num , G_Worker *g_work) : g_worker(g_work)
{
g_listenThread = new G_ListenThread(this);
g_listenThread->Start(); ///启动监听线程
g_sendMessThread = new G_SendMessThread();
g_sendMessThread->Start(); ///发送消息线程
for(int i=0; i<num; i++)
{
/// 启动处理client发送信息线程 , 收消息线程
G_RecvMessThread *g_recvMessThread = new G_RecvMessThread(this);
g_idleRecvMessThreadQueue.push(g_recvMessThread);
g_recvMessThread->Start();
}
Start(); ///线程池自己启动
}
G_ThreadPool::~G_ThreadPool()
{
if(g_listenThread)
{
delete g_listenThread;
g_listenThread = NULL;
}
if(g_sendMessThread)
{
delete g_sendMessThread;
g_sendMessThread = NULL;
}
g_sockQueue.clear();
g_idleRecvMessThreadQueue.clear();
g_busyRecvMessThreadQueue.clear();
}
bool G_ThreadPool::Bind(unsigned int nPort)
{
return g_listenThread->Bind(nPort);
}
int G_ThreadPool::sendMessage(int nSocket , const void *pStr)
{
g_sendMessThread->sendMessage(nSocket , pStr);
}
void G_ThreadPool::Run()
{
int nSocket;
G_RecvMessThread *g_recvMessThread;
while(1)
{
pause(); ///等待ListenThread 发信号
while(popSocket(nSocket)) ///必须把存放socket队列中的套接口全部取出
{
g_sendMessThread->addEpoll(nSocket);
while(1)
{
///从空闲队列中获得对首TaskThread
if(g_idleRecvMessThreadQueue.getFront(g_recvMessThread))
{
///如果TaskThread线程中客户大于maxCounter , 从空闲队列中pop并放到忙碌队列中
if(g_recvMessThread->getCounter() >= maxCounter)
{
if(g_idleRecvMessThreadQueue.pop(g_recvMessThread))
{
g_busyRecvMessThreadQueue.push(g_recvMessThread);
}
else
{
///表示空闲队列中再没有TaskThread可以用 , 创建addTaskThread个TaskThread线程 , 并且把busy队列中的TaskThread放到idle队列中这样可以防止busy队列中的用户数减少但是他还在busy队列中
for(int i=0; i<addTaskThread; i++)
{
G_RecvMessThread *g_recvMessThread = new G_RecvMessThread(this);
g_idleRecvMessThreadQueue.push(g_recvMessThread);
g_recvMessThread->Start();
}
while(g_busyRecvMessThreadQueue.pop(g_recvMessThread))
{
g_idleRecvMessThreadQueue.push(g_recvMessThread);
}
}
}
else
{
/// 填加到TaskThread 线程中
g_recvMessThread->addSocket(nSocket);
g_recvMessThread->continues(); /// 唤醒TaskThread 线程
break;
}
}
else
{
/// 空闲队列中没有任何线程 , 应该没有这种情况
debug_output("idleRecvMessThreadQueue is not g_recvMessThread\n");
}
}
}
}
}
bool G_ThreadPool::pushSocket(unsigned int nSocket)
{
return g_sockQueue.push(nSocket);
}
bool G_ThreadPool::popSocket(int &nSocket)
{
return g_sockQueue.pop(nSocket);
}
void G_ThreadPool::recvMessage(void *pStr , int nSocket)
{
g_worker->recvMessage(pStr , nSocket);
}