©®linuxÉçÇø©® °®ÐÄÔ®Öú ©® LinuxÈÏÖ¤©®ÏµÁÐ½Ì³Ì ©® Òµ½ç¶¯Ì¬©® Õ¾ÎñÐÂÎÅ ©® ¹«Ë¾ÕÐÆ¸©® ½¨ÒéÁôÑÔ ©® ÍøÖ·´óÈ« ©®LPIרÌâ©® CISCOרÌâ
ÉèΪÊ×Ò³
¼ÓÈëÊÕ²Ø
¹ÜÀíÍŶÓ
JSP  
JAVA  
PERL  
 ÄúµÄλÖãºÊ×Ò³ > article > Linux¿ª·¢Çø > Èí¼þ¿ª·¢ >
À¸Ä¿µ¼À¸
×ÊÁÏËÑË÷
ÈÈÃÅÎÄÕÂ
¡¤Linux Ï C ÓïÑÔ±à³Ì
¡¤LinuxϵÄͨÓÃÏ̳߳ش´½¨
¡¤C++×Ö·û´®×ª»»Æª
¡¤linux C ½ø³Ì²Ù×÷ƪ
¡¤linuxÉϵÄC/C++±àÒëÆ÷gcc/egcs
¡¤linux C ÎļþȨÏÞ¿ØÖÆÆª
¡¤GCCʹÓÃÊÖ²á
¡¤linux C ½Ó¿Ú´¦ÀíÆª
¡¤ÔÚRedhat LinuxÉϰ²×° GCC ±àÒë
¡¤fopen()º¯ÊýµÄ²ÎÊý˵Ã÷
¡¤CÓïÑÔÔËËã·û
¡¤GCCʹÓÃÖ¸ÄÏ
¡¤LinuxÏÂC¿ª·¢»·¾³µÄ¹¹³ÉºÍ°²×°
¡¤GCCʹÓÃÊÖ²áÓë³£ÓÃÃüÁî
¡¤Linux³£ÓÃCº¯Êý-ÈÕÆÚʱ¼äƪ
×îÐÂÎÄÕÂ
¡¤epollÈëÃÅ
¡¤ÔÚLinuxÏ·¢²¼³ÌÐòÐèҪעÒâ°æ±¾
¡¤Suse LinuxϵͳÏÂJAVA AWT½çÃæ
¡¤Vim±àÒëÆ÷ÅäºÏctagsʵÏÖº¯ÊýÔ­
¡¤ÔÚUbuntu Linux 8.04ÉϹ¹½¨GCC
¡¤Linux²Ù×÷ϵͳÏÂSocket±à³ÌµØÖ·
¡¤½«VC³ÌÐòÒÆÖ²µ½LinuxϵͳµÄ¼¸µã
¡¤LinuxÏÂmalloc/freeÓënew/dele
¡¤LinuxÏÂÓÃGTKºÍsocketʵÏÖ¼òµ¥
¡¤Linux²Ù×÷ϵͳÏÂÈÃTomcatÆô¶¯ÔÚ
¡¤Linux²Ù×÷ϵͳÖÐÈçºÎ±àÒëC³ÌÐò
¡¤¼¸ÖÖ³£±»ÈËÃǺöÂÔµÄLinuxϵͳÏÂ
¡¤Eclipse±à³Ì¹¤¾ß ÔÚUbuntuϵÄ
¡¤Linux²Ù×÷ϵͳϵÄÍøÂçµØÖ·×ª»»
¡¤ÀÏÊÖ¾­Ñé̸£ºLinuxÇý¶¯³ÌÐò¿ª·¢
Google
 
LinuxϵÄͨÓÃÏ̳߳ش´½¨
[ ×÷Õß:  ¼ÓÈëʱ¼ä:2005-11-25 10:29:41  À´×Ô: ]
    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ÂÛ̳ÌÖÂÛ
·ÖÒ³£º1 2 3 4 5 [6] 7
¡¾ÆÀÂÛ¡¿¡¾¼ÓÈëÊղؼС¿¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿¡¾¹Ø±Õ¡¿
¡ù Ïà¹ØÁ´½Ó
ÎÞÏà¹ØÐÅÏ¢