SetThreadState(THREAD_RUNNING);
for(;;)
{
while(m_Job == NULL)
m_JobCond.Wait();
m_Job->Run(m_JobData);
m_Job->SetWorkThread(NULL);
m_Job = NULL;
m_ThreadPool->MoveToIdleList(this);
if(m_ThreadPool->m_IdleList.size() > m_ThreadPool->GetAvailHighNum())
{
m_ThreadPool->DeleteIdleThread(m_ThreadPool->m_IdleList.size()-m_T
hreadPool->GetInitNum());
}
m_WorkMutex.Unlock();
}
}
void CWorkerThread::SetJob(CJob* job,void* jobdata)
{
m_VarMutex.Lock();
m_Job = job;
m_JobData = jobdata;
job->SetWorkThread(this);
m_VarMutex.Unlock();
m_JobCond.Signal();
}
void CWorkerThread::SetThreadPool(CThreadPool* thrpool)
{
m_VarMutex.Lock();
m_ThreadPool = thrpool;
&nbs, p; m_VarMutex.Unlock();
}
µ±Ïß³ÌÖ´ÐÐÈÎÎñ֮ǰÊ×ÏȱØÐëÅжϿÕÏÐÏ̵߳ÄÊýÄ¿ÊÇ·ñµÍÓÚm_AvailLow£¬Èç¹ûµÍÓÚ£¬Ôò±ØÐë´´½¨×ã¹»µÄ¿ÕÏÐỊ̈߳¬Ê¹ÆäÊýÄ¿´ïµ½m_InitNum¸ö£¬È»ºó½«µ÷ÓÃMoveToBusyList()ÒÆ³ö¿ÕÏжÓÁУ¬ÒÆÈëæµ¶ÓÁС£µ±ÈÎÎñÖ´ÐÐÍê±Ïºó£¬ÆäÓÖµ÷ÓÃMoveToIdleList()ÒÆ³öæµ¶ÓÁУ¬ÒÆÈë¿ÕÏжÓÁУ¬µÈ´ýеÄÈÎÎñ¡£
³ýÁËRun·½·¨Ö®Í⣬CWorkerThreadÖÐÁíÍâÒ»¸öÖØÒªµÄ·½·¨¾ÍÊÇSetJob£¬¸Ã·½·¨½«Êµ¼ÊµÄÈÎÎñ¸³Öµ¸øÏ̡߳£µ±Ã»ÓÐÈκÎÖ´ÐÐÈÎÎñ¼´m_JobΪNULLµÄʱºò£¬Ï߳̽«µ÷ÓÃm_JobCond.Wait½øÐеȴý¡£Ò»µ©Job±»¸³Öµ¸øỊ̈߳¬Æä½«µ÷ÓÃm_JobCond.Signal·½·¨»½ÐѸÃÏ̡߳£ÓÉÓÚm_JobCondÊôÓÚÏß³ÌÄÚ²¿µÄ±äÁ¿£¬Ã¿¸öÏ̶߳¼Î¬³ÖÒ»¸öm_JobCond£¬Ö»Óеõ½ÈÎÎñµÄÏ̲߳ű»»½ÐÑ£¬Ã»Óеõ½ÈÎÎñµÄ½«¼ÌÐøµÈ´ý¡£ÎÞÂÛÒ»¸öÏ̺߳Îʱ±»»½ÐÑ£¬Æä¶¼½«´ÓµÈ´ýµÄµØ·½¼ÌÐøÖ´ÐÐm_Job->Run(m_JobData)£¬ÕâÊÇÏß³ÌÖ´ÐÐʵ¼ÊÈÎÎñµÄµØ·½¡£
ÔÚÏß³ÌÖ´Ðиø¶¨JobÆÚ¼ä£¬ÎÒÃDZØÐë·ÀÖ¹ÁíÍâÒ»¸öJobÓÖ¸³¸ø¸ÃỊ̈߳¬Òò´ËÔÚ¸³ÖµÖ®Ç°£¬Í¨¹ým_VarMutex½øÐÐËø¶¨£¬ JobÖ´ÐÐÆÚ¼ä£¬ÆäÓÚµÄJob½«²»ÄܹØÁªµ½¸ÃỊ̈߳»ÈÎÎñÖ´ÐÐÍê±Ï£¬ÎÒÃǵ÷ÓÃm_VarMutex.Unlock()½øÐнâËø£¬´Ëʱ£¬Ïß³ÌÓÖ¿ÉÒÔ½ÓÊÜеÄÖ´ÐÐÈÎÎñ¡£
ÔÚÏß³ÌÖ´ÐÐÈÎÎñ½áÊøºó·µ»Ø¿ÕÏжÓÁÐǰ£¬ÎÒÃÇ»¹ÐèÒªÅжϵ±Ç°¿ÕÏжÓÁÐÖеÄÏß³ÌÊÇ·ñ¸ßÓÚm_AvailHigh¸ö¡£Èç¹û³¬¹ým_AvailHigh£¬Ôò±ØÐë´ÓÆäÖÐɾ³ý(m_ThreadPool->m_IdleList.size()-m_ThreadPool->GetInitNum())¸öỊ̈߳¬Ê¹Ïß³ÌÊýÄ¿±£³ÖÔÚm_InitNum¸ö¡£
CJob
CJobÀàÏà¶Ô¼òµ¥£¬Æä·â×°ÁËÈÎÎñµÄ»ù±¾µÄÊôÐԺͷ½·¨£¬ÆäÖÐ×îÖØÒªµÄÊÇRun·½·¨£¬´úÂëÈçÏ£º
class CJob
{
private:
int m_JobNo; //The num was assigned to the job
char* m_JobName; //The job name
CThread *m_pWorkThread; //The thread associated with the job
public:
CJob( void );
virtual ~CJob();
int GetJobNo(void) const { return m_JobNo; }
void SetJobNo(int jobno){ m_JobNo = jobno;}
char* GetJobName(void) const { return m_JobName; }
void SetJobName(char* jobname);
CThread *GetWorkThread(void){ return m_pWorkThread; }
void SetWorkThread ( CThread *pWorkThread ){
m_pWorkThread = pWorkThread;
}
virtual void Run ( void *ptr ) = 0;
};
CJob::CJob(void)
:m_pWorkThread(NULL)
,m_JobNo(0)
,m_JobName(NULL)
{
}
CJob::~CJob(){
if(NULL != m_JobName)
free(m_JobName);
}
void CJob::SetJobName(char* jobname)
{
if(NULL !=m_JobName) {
free(m_JobName);
m_JobName = NULL;
}
if(NULL !=jobname) {
m_JobName = (char*)malloc(strlen(jobname)+1);
strcpy(m_JobName,jobname);
}
}
Ï̳߳ØÊ¹ÓÃʾÀý
ÖÁ´ËÎÒÃǸø³öÁËÒ»¸ö¼òµ¥µÄÓë¾ßÌåÈÎÎñÎ޹صÄÏ̳߳ؿò¼Ü¡£Ê¹Óøÿò¼Ü·Ç³£µÄ¼òµ¥£¬ÎÒÃÇËùÐèÒªµÄ×öµÄ¾ÍÊÇÅÉÉúCJobÀ࣬½«ÐèÒªÍê³ÉµÄÈÎÎñʵÏÖÔÚRun·½·¨ÖС
LinuxÁªÃËÊÕ¼¯ÕûÀí ,תÌùÇë±êÃ÷ÔʼÁ´½Ó,ÈçÓÐÈκÎÒÉÎÊ»¶ÓÀ´±¾Õ¾LinuxÂÛ̳ÌÖÂÛ