Linux_线程池

一.功能

   线程池中有若干个线程,用于执行大量相对短暂的任务

二.功能描述

  计算密集型任务:线程池中线程个数=CPU个数

  I/O密集型任务:线程池中线程个数>CPU个数

  当任务增加时,可以动态增加线程池中线程个数,当任务执行完成后,可以动态减少线程池中线程个数

  运用生产消费者模型,生产者线程向任务队列中添加任务,任务队列中如果没有任务,如果有等待线程就唤醒并执行任务,如果线程池中没有等待线程并且没有达到上限,就添加新的线程到线程池

三.代码梳理

main.c

创建线程池 -->初始化线程池-->不断向线程池中添加任务-->销毁线程池

线程池的结构

 // 任务队列(链表)
 typedef struct task{
     void *(*pfun)(void*); // 回调函数
     void *arg;           // 回调函数参数
     struct task *next;
 }task_t;

//互斥量
 typedef struct condition {
     pthread_mutex_t mutex;
     pthread_cond_t pcond;
 } condition_t;

 typedef struct threadpool {
     condition_t cond; // 同步互斥
     task_t *first;    // 任务队列的对头
     task_t *tail;     // 队尾指针
     int max_thread;   // 最大线程个数
     int idle;         // 空闲线程个数
     int counter;      // 线程池当前的线程个数
}threadpool_t;

threadpool.h所做的工作

1)初始化线程池

2)执行线程池中的任务(创建线程时传参传线程池的结构体)

    a)上锁

    b)空闲线程个数+1  ?

    c)如果此时任务队列为空,等待添加任务

    d)因为此时线程将要执行任务,所以空闲线程-1

    e)如果此时任务队列不为空

                1>取此时任务队列的队头

                2>防止任务执行太久,解锁

                3>执行任务

                4>上锁,释放原来的队头,解锁

3)向线程池中添加任务

    a)生成任务结点 task_t

    b)上锁(对链表进行的动作都要上锁)

    c)判断队头是否为空,采用尾插,更新尾巴

    d)如果有空闲线程,发送signal,或者线程个数小于最大线程个数,增加线程。

    e)解锁

4)销毁线程池

    销毁互斥量和条件变量

上代码:

  1 #include <unistd.h>
  2 #include <pthread.h>
  3 #include <stdlib.h>
  4 #include "cond.h"
  5 
  6 #define MAX 15
  7 
  8 //任务队列
  9 typedef struct tast{
 10     void*(*pfun) (void *);//回调函数
 11     void * arg; //回调函数参数
 12     struct task *next;
 13 }task_t;
 14 
 15 //线程池
 16 typedef struct threadpool{
 17     condition_t cond;//互斥量
 18     task_t *first; //任务队列的队头
 19     task_t *tail; //任务队列队尾
 20     int max_thread; //最大线程数
 21     int idle; //空闲线程个数
 22     int counter; //线程池当前线程个数
 23 }threadpool_t;
 24 
 25 
 26 void threadpool_init(threadpool_t *pool);
 27 void* myroute(void *arg);
 28 void threadpool_add(threadpool_t *pool,void*(*pfun1)(void *),void *arg1);
 29 void threadpool_destroy(threadpool_t *pool);
  1 #include "thread.h"
  2 
  3 void threadpool_init(threadpool_t *pool){
  4     cond_init(&(pool->cond));
  5     pool->first=NULL;
  6     pool->tail=NULL;
  7     pool->max_thread=MAX;
  8     pool->idle=0;
  9     pool->counter=0;
 10 }
 11 
 12 void* myroute(void *arg){
 13     threadpool_t *pool=(threadpool_t *)arg;
 14     while(1){
 15         cond_lock(&pool->cond);
 16         pool->idle++;
 17         if(pool->first==NULL){
 18             cond_wait(&pool->cond);
 19         }
 20         pool->idle--;
 21 
 22         if(pool->first!=NULL){
 23             task_t *t=pool->first;
 24             pool->first=pool->first->next;
 25             cond_unlock(&pool->cond);
 26 
 27             (t->pfun)(t->arg);
 28             cond_lock(&pool->cond);
 29             free(t);
 30         }
 31             cond_unlock(&pool->cond);
 32     }
 33 }
 34 
 35 void threadpool_add(threadpool_t *pool,void*(*pfun1)(void *),void *arg1){
 36     task_t *new=(task_t *)malloc(sizeof(task_t));
 37     new->pfun=pfun1;
 38     new->arg=arg1;
 39     new->next=NULL;
 40     cond_lock(&pool->cond);
 41     if(pool->first==NULL){
 42         pool->first=new;
 43     }else{
 44         pool->tail->next=new;
 45     }
 46     pool->tail=new;
 47     
 48     if(pool->idle>0){
 49         cond_signal(&pool->cond);
 50     }else if(pool->counter<pool->max_thread){
 51         pthread_t tid;
 52         pthread_create(&tid,NULL,myroute,(void *)pool);
 53         pool->counter++;
 54     }
 55     cond_unlock(&pool->cond);
 56 }
 57 
 58 void threadpool_destroy(threadpool_t *pool){
 59     cond_destroy(&pool->cond);
 60 }

condition.c

  1 #include <pthread.h>
  2 
  3 //互斥量
  4 typedef struct condition{
  5     pthread_mutex_t mutex;
  6     pthread_cond_t cond;
  7 }condition_t; 
  1 #include "cond.h"
  2 
  3 void cond_init(condition_t *condi){
  4     pthread_mutex_init(&condi->mutex,NULL);
  5     pthread_cond_init(&condi->cond,NULL);
  6 }
  7 
  8 void cond_lock(condition_t *condi){
  9     pthread_mutex_lock(&condi->mutex);
 10 }
 11 
 12 void cond_unlock(condition_t *condi){
 13     pthread_mutex_unlock(&condi->mutex);
 14 }
 15 
 16 void cond_wait(condition_t *condi){
 17     pthread_cond_wait(&condi->cond,&condi->mutex);
 18 }
 19 
 20 void cond_signal(condition_t *condi){
 21     pthread_cond_signal(&condi->cond);
 22 }
 23 
 24 void cond_destroy(condition_t *condi){
 25     pthread_mutex_destroy(&condi->mutex);
 26     pthread_cond_destroy(&condi->cond);
 27 }              

main.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include "thread.h"
  4 
  5 
  6 void * route(void * arg){
  7     int num=*(int *)arg;
  8     free(arg);
  9     printf("%#X thread say %d runing\n",pthread_self(),num);
 10     sleep(1);
 11 }
 12 
 13 int main(void){
 14     threadpool_t pool;
 15     threadpool_init(&pool);
 16     int i=0;
 17     for(;i<10;i++){
 18         int *p=malloc(sizeof(int));
 19         *p=i;
 20         threadpool_add(&pool,route,(void*)p);
 21     }
 22     sleep(15);
 23     threadpool_destroy(&pool);
 24 }                           

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值