linux-线程池实现

线程池-pthread_pool

  1. 含义:顾名思义,线程池是集中管理多个线程的工具,在其中包含着多个线程的存储以及对线程任务的处理。
  2. 源代码:

1)任务序列:
通过回调函数call_back指定线程所要执行的任务。
在线程池中用struct job*head,tail链接形成任务序列。

struct jobs{
    void* (*call_back)(void* i);
    void* i;
    struct jobs* next; 
};

2)线程池结构体:

struct thread_pool
{
    int pthread_num;//线程数目
    int queue_max_num;//任务队列的最大数目
    int queue_cur_num;//任务队列的当前数目
    struct jobs* head;//任务队列头指针
    struct jobs* tail;//任务队列尾指针
    pthread_t *pthreads;//线程数组
    pthread_mutex_t mutex;
    pthread_cond_t queue_empty;//队列为空
    pthread_cond_t queue_not_empty;//队列不为空(任务队列有任务)
    pthread_cond_t queue_not_full;//队列不为满
    int pool_close;

};

3)线程池初始化函数
返回一个空的线程池指针new

struct thread_pool* pool_init(int pthread_num,int queue_max_num)
{
    struct thread_pool *new=(struct thread_pool*)malloc(sizeof(struct thread_pool));
    new->pthread_num=pthread_num;
    new->queue_max_num=queue_max_num;
    new->queue_cur_num=0;
    new->head=new->tail=NULL;
    new->pthreads=malloc(sizeof(pthread_t)*pthread_num);

    for(int i=0;i<pthread_num;i++)
    {
       pthread_create(&new->pthreads[i],NULL,pool_function,(void*)new);
       // 每个线程默认执行pool_function函数 并将线程池传入
    }
    pthread_mutex_init(&new->mutex,NULL);
    pthread_cond_init(&new->queue_empty,NULL);
    pthread_cond_init(&new->queue_not_empty,NULL);
    pthread_cond_init(&new->queue_not_full,NULL);
    new->pool_close=0;
    if(new==NULL){
        printf("init erro\n");
        return 0;
    }
    else return new;
}

4)添加任务函数函数
向线程池任务队列中添加任务,function为函数指针即线程要执行的函数。

void add_job(struct thread_pool* pool,void*(*function)(void*),void* i)
{
    
    pthread_mutex_lock(&pool->mutex);
    //如果超过最大值则阻塞中not_full条件上
    while (pool->queue_cur_num==pool->queue_max_num)
    {
        pthread_cond_wait(&pool->queue_not_full,&pool->mutex);
    }
    
    //初始化job
    struct jobs* job=malloc(sizeof(struct jobs));
    if(job==NULL){
        printf("job malloc erro");
        _exit(0);
    }
    job->call_back=function;
    job->i=i;
    //将job添加到pool中的链表
    if(pool->head==NULL&&pool->tail==NULL)//如果job为第一个
    {
        job->next=NULL;
        pool->head=pool->tail=job;
    }
    else{
        pool->tail->next=job;
        pool->tail=job;
    }
    pool->queue_cur_num++;
    pthread_mutex_unlock(&pool->mutex);
    if(pool->queue_cur_num!=0) 
        pthread_cond_signal(&pool->queue_not_empty);

} 

5)loop:每个线程循环执行的函数
//不断的执行任务队列中的任务

void* pool_function(void* i)
{
    struct thread_pool* pool=(struct thread_pool*)i;
    
    while(1){
    pthread_mutex_lock(&pool->mutex);
    while(pool->queue_cur_num==0&&pool->pool_close==0)
    {
        pthread_cond_wait(&pool->queue_not_empty,&pool->mutex);//刚创建所有的线程都会阻塞在not_empty这个条件上
    }
    //当等待队列不为空时,执行其中的一个job
 
    struct jobs *pjob=pool->head;
    pool->queue_cur_num--;
    //执行完一个程序后唤醒阻塞中not_full上的线程
    if(pool->queue_cur_num<pool->queue_max_num)
        pthread_cond_signal(&pool->queue_not_full);
    pool->head=pool->head->next;
    //到最后head会为nuLL而tail为最后一个job
    if(pool->head==NULL)
        pool->tail=NULL;
    pthread_mutex_unlock(&pool->mutex);

    (*(pjob->call_back))(pjob->i);//执行第一个job的函数  
     free(pjob);
     if(pool->queue_cur_num==0&&pool->pool_close==0)
        pthread_cond_signal(&pool->queue_empty);
  }
}

6)供测试用的任务函数

void* work(void* i)
{
    printf("i do it\n");
}
void* print1(void* i)
{
    printf("1\n");
}

7)线程池销毁
释放内存,销毁锁

void destroy(struct thread_pool* pool)
{
    pthread_mutex_lock(&pool->mutex);
    if(pool->queue_cur_num!=0)
        pthread_cond_wait(&pool->queue_empty,&pool->mutex);
    struct jobs* temp;
    // struct jobs* cur=pool->head;
    while(pool->head!=pool->tail)
    {
        temp=pool->head;
        pool->head=pool->head->next;
        free(temp);
    }

    free(pool->head);
    free(pool->tail);
    for(int i=0;i<pool->pthread_num;i++)
    {
    pthread_join(pool->pthreads[i],NULL);
    }
    pthread_mutex_destroy(&pool->mutex);
    pthread_cond_destroy(&pool->queue_empty);
    pthread_cond_destroy(&pool->queue_not_empty);
    pool->pool_close=1;//关闭标志
}

8)main函数

int main()
{
    struct thread_pool *pool=pool_init(5,10);//5个线程 10个job
    add_job(pool,work,NULL);
    add_job(pool,work,NULL);
    add_job(pool,print1,NULL);
    add_job(pool,print1,NULL);
    add_job(pool,print1,NULL);
    add_job(pool,print1,NULL);
    add_job(pool,print1,NULL);
    sleep(4);
    destroy(pool);
    while(1);

    return 0;
}

3.执行结果:
与所预想结果对应,调用了2次work函数,5次print1函数,因为只有5个线程,所以应该是成功了.
在这里插入图片描述

数据中心机房是现代信息技术的核心设施,它承载着企业的重要数据和服务,因此,其基础设计与规划至关重要。在制定这样的方案时,需要考虑的因素繁多,包括但不限于以下几点: 1. **容量规划**:必须根据业务需求预测未来几年的数据处理和存储需求,合理规划机房的规模和设备容量。这涉及到服务器的数量、存储设备的容量以及网络带宽的需求等。 2. **电力供应**:数据中心是能源消耗大户,因此电力供应设计是关键。要考虑不间断电源(UPS)、备用发电机的容量,以及高效节能的电力分配系统,确保电力的稳定供应并降低能耗。 3. **冷却系统**:由于设备密集运行,散热问题不容忽视。合理的空调布局和冷却系统设计可以有效控制机房温度,避免设备过热引发故障。 4. **物理安全**:包括防火、防盗、防震、防潮等措施。需要设计防火分区、安装烟雾探测和自动灭火系统,设置访问控制系统,确保只有授权人员能进入。 5. **网络架构**:规划高速、稳定、冗余的网络架构,考虑使用光纤、以太网等技术,构建层次化网络,保证数据传输的高效性和安全性。 6. **运维管理**:设计易于管理和维护的IT基础设施,例如模块化设计便于扩展,集中监控系统可以实时查看设备状态,及时发现并解决问题。 7. **绿色数据中心**:随着环保意识的提升,绿色数据中心成为趋势。采用节能设备,利用自然冷源,以及优化能源管理策略,实现低能耗和低碳排放。 8. **灾难恢复**:考虑备份和恢复策略,建立异地灾备中心,确保在主数据中心发生故障时,业务能够快速恢复。 9. **法规遵从**:需遵循国家和地区的相关法律法规,如信息安全、数据保护和环境保护等,确保数据中心的合法运营。 10. **扩展性**:设计时应考虑到未来的业务发展和技术进步,保证机房有充足的扩展空间和升级能力。 技术创新在数据中心机房基础设计及规划方案中扮演了重要角色。例如,采用虚拟化技术可以提高硬件资源利用率,软件定义网络(SDN)提供更灵活的网络管理,人工智能和机器学习则有助于优化能源管理和故障预测。 总结来说,一个完整且高效的数据中心机房设计及规划方案,不仅需要满足当前的技术需求和业务目标,还需要具备前瞻性和可持续性,以适应快速变化的IT环境和未来可能的技术革新。同时,也要注重经济效益,平衡投资成本与长期运营成本,实现数据中心的高效、安全和绿色运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值