linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > Linux开发区 > 软件开发 >
栏目导栏
资料搜索
热门文章
·Linux 下 C 语言编程
·Linux下的通用线程池创建
·C++字符串转换篇
·linux C 进程操作篇
·linux上的C/C++编译器gcc/egcs
·GCC使用手册
·linux C 文件权限控制篇
·fopen()函数的参数说明
·linux C 接口处理篇
·在Redhat Linux上安装 GCC 编译
·C语言运算符
·GCC使用指南
·Linux下C开发环境的构成和安装
·Linux常用C函数-日期时间篇
·GCC使用手册与常用命令
最新文章
·从脚本编写到面向对象的 Pytho
·Linux平台下的Maya:Blender 简
·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下的
Google
 
Linux下的通用线程池创建
[ 作者:  加入时间:2005-11-25 10:29:41  来自: ]
list
    CCondition       m_IdleJobCond;  //m_JobCond is used to sync job list
    CCondition       m_MaxNumCond;
 
    vector<CWorkerThread*>   m_ThreadList;
    vector<CWorkerThread*>   m_BusyList;     //Thread List
    vector<CWorkerThread*>   m_IdleList; //Idle List
 
    CThreadPool();
    CThreadPool(int initnum);
    virtual ~CThreadPool();
 
    void    SetMaxNum(int maxnum){m_MaxNum = maxnum;}
    int     GetMaxNum(void){return m_MaxNum;}
    void    SetAvailLowNum(int minnum){m_AvailLow = minnum;}
    int     GetAvailLowNum(void){return m_AvailLow;}
    void    SetAvailHighNum(int highnum){m_AvailHigh = highnum;}
    int     GetAvailHighNum(void){return m_AvailHigh;}
    int     GetActualAvailNum(void){return m_AvailNum;}
    int     GetAllNum(void){return m_ThreadList.size();}
    int     GetBusyNum(void){return m_BusyList.size();}
    void    SetInitNum(int initnum){m_InitNum = initnum;}
    int     GetInitNum(void){return m_InitNum;}
  
    void    TerminateAll(void);
    void    Run(CJob* job,void* jobdata);
};
CThreadPool::CThreadPool()
{
    m_MaxNum = 50;
    m_AvailLow = 5;
    m_InitNum=m_AvailNum = 10 ;  
    m_AvailHigh = 20;
 
    m_BusyList.clear();
    m_IdleList.clear();
    for(int i=0;i<m_InitNum;i++){
    CWorkerThread* thr = new CWorkerThread();
    thr->SetThreadPool(this);
    AppendToIdleList(thr);
    thr->Start();
    }
}
 
CThreadPool::CThreadPool(int initnum)
{
    assert(initnum>0 && initnum<=30);
    m_MaxNum   = 30;
    m_AvailLow = initnum-10>0?initnum-10:3;
    m_InitNum=m_AvailNum = initnum ;  
    m_AvailHigh = initnum+10;
 
    m_BusyList.clear();
    m_IdleList.clear();
    for(int i=0;i<m_InitNum;i++){
    CWorkerThread* thr = new CWorkerThread();
    AppendToIdleList(thr);
    thr->SetThreadPool(this);
    thr->Start();       //begin the thread,the thread wait for job
    }
}
 
CThreadPool::~CThreadPool()
{
   TerminateAll();
}
 
void CThreadPool::TerminateAll()
{
    for(int i=0;i < m_ThreadList.size();i++) {
    CWorkerThread* thr = m_ThreadList[i];
    thr->Join();
    }
    return;
}
 
CWorkerThread* CThreadPool::GetIdleThread(void)
{
    while(m_IdleList.size() ==0 )
    m_IdleCond.Wait();
   
    m_IdleMutex.Lock();
    if(m_IdleList.size() > 0 )
    {
    CWorkerThread* thr = (CWorkerThread*)m_IdleList.front();
    printf("Get Idle thread %dn",thr->GetThreadID());
    m_IdleMutex.Unlock();
    return thr;
    }
    m_IdleMutex.Unlock();
 
    return NULL;
}
 
//add an idle thread to idle list
void CThreadPool::AppendToIdleList(CWorkerThread* jobthread)
{
    m_IdleMutex.Lock();
    m_IdleList. Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
分页:1 2 [3] 4 5 6 7
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息