亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言實現支持動態拓展和銷毀的線程池

2020-01-26 14:46:44
字體:
來源:轉載
供稿:網友

本文實例介紹了C 語言實現線程池,支持動態拓展和銷毀,分享給大家供大家參考,具體內容如下

實現功能

  • 1.初始化指定個數的線程
  • 2.使用鏈表來管理任務隊列
  • 3.支持拓展動態線程
  • 4.如果閑置線程過多,動態銷毀部分線程
#include <stdio.h>#include <pthread.h>#include <stdlib.h>#include <signal.h> /*線程的任務隊列由,函數和參數組成,任務由鏈表來進行管理*/typedef struct thread_worker_s{  void *(*process)(void *arg); //處理函數  void *arg;          //參數  struct thread_worker_s *next;}thread_worker_t; #define bool int#define true 1#define false 0 /*線程池中各線程狀態描述*/#define THREAD_STATE_RUN        0#define THREAD_STATE_TASK_WAITING   1#define THREAD_STATE_TASK_PROCESSING  2#define THREAD_STATE_TASK_FINISHED   3#define THREAD_STATE_EXIT       4     typedef struct thread_info_s{  pthread_t id;  int    state;   struct thread_info_s *next;}thread_info_t; static char* thread_state_map[] ={"創建","等待任務","處理中","處理完成","已退出"};/*線程壓縮的時候只有 0,1,2,4 狀態的線程可以銷毀*/  /*線程池管理器*/#define THREAD_BUSY_PERCENT 0.5  /*線程:任務 = 1:2 值越小,說明任務多,增加線程*/#define THREAD_IDLE_PERCENT 2   /*線程:任務 = 2:1 值大于1,線程多于任務,銷毀部分線程*/ typedef struct thread_pool_s{  pthread_mutex_t queue_lock ; //隊列互斥鎖,即涉及到隊列修改時需要加鎖  pthread_cond_t queue_ready; //隊列條件鎖,隊列滿足某個條件,觸發等待這個條件的線程繼續執行,比如說隊列滿了,隊列空了   thread_worker_t *head   ;    //任務隊列頭指針  bool    is_destroy   ;    //線程池是否已經銷毀  int num;              //線程的個數  int rnum;         ;    //正在跑的線程  int knum;         ;    //已殺死的線程  int queue_size       ;    //工作隊列的大小   thread_info_t *threads   ;    //線程組id,通過pthread_join(thread_ids[0],NULL) 來執行線程  pthread_t   display   ;    //打印線程  pthread_t   destroy   ;    //定期銷毀線程的線程id  pthread_t   extend    ;  float percent       ;    //線程個數于任務的比例 rnum/queue_size  int  init_num      ;  pthread_cond_t  extend_ready     ;    //如果要增加線程}thread_pool_t; /*-------------------------函數聲明----------------------*//** * 1.初始化互斥變量 * 2.初始化等待變量 * 3.創建指定個數的線程線程 */thread_pool_t* thread_pool_create(int num);void *thread_excute_route(void *arg);  /*調試函數*/void debug(char *message,int flag){  if(flag)    printf("%s/n",message);} void *display_thread(void *arg);/** * 添加任務包括以下幾個操作 * 1.將任務添加到隊列末尾 * 2.通知等待進程來處理這個任務 pthread_cond_singal();*/int thread_pool_add_worker(thread_pool_t *pool,void*(*process)(void *arg),void *arg); //網線程池的隊列中增加一個需要執行的函數,也就是任務 /** * 銷毀線程池,包括以下幾個部分 * 1.通知所有等待的進程 pthread_cond_broadcase * 2.等待所有的線程執行完 * 3.銷毀任務列表 * 4.釋放鎖,釋放條件 * 4.銷毀線程池對象 */   void *thread_pool_is_need_recovery(void *arg);void *thread_pool_is_need_extend(void *arg);void thread_pool_destory(thread_pool_t *pool);  thread_pool_t *thread_pool_create(int num){  if(num<1){    return NULL;  }  thread_pool_t *p;  p = (thread_pool_t*)malloc(sizeof(struct thread_pool_s));  if(p==NULL)    return NULL;  p->init_num = num;  /*初始化互斥變量與條件變量*/  pthread_mutex_init(&(p->queue_lock),NULL);  pthread_cond_init(&(p->queue_ready),NULL);   /*設置線程個數*/  p->num  = num;   p->rnum = num;  p->knum = 0;   p->head = NULL;  p->queue_size =0;   p->is_destroy = false;      int i=0;  thread_info_t *tmp=NULL;  for(i=0;i<num;i++){    /*創建線程*/    tmp= (struct thread_info_s*)malloc(sizeof(struct thread_info_s));    if(tmp==NULL){      free(p);      return NULL;    }else{      tmp->next = p->threads;      p->threads = tmp;    }    pthread_create(&(tmp->id),NULL,thread_excute_route,p);    tmp->state = THREAD_STATE_RUN;  }   /*顯示*/  pthread_create(&(p->display),NULL,display_thread,p);  /*檢測是否需要動態線程*/  //pthread_create(&(p->extend),NULL,thread_pool_is_need_extend,p);  /*動態銷毀*/  pthread_create(&(p->destroy),NULL,thread_pool_is_need_recovery,p);  return p;} int thread_pool_add_worker(thread_pool_t *pool,void*(*process)(void*arg),void*arg){  thread_pool_t *p= pool;  thread_worker_t *worker=NULL,*member=NULL;  worker = (thread_worker_t*)malloc(sizeof(struct thread_worker_s));  int incr=0;  if(worker==NULL){    return -1;  }  worker->process = process;  worker->arg   = arg;  worker->next  = NULL;  thread_pool_is_need_extend(pool);  pthread_mutex_lock(&(p->queue_lock));  member = p->head;  if(member!=NULL){    while(member->next!=NULL)      member = member->next;    member->next = worker;  }else{    p->head = worker;  }  p->queue_size ++;  pthread_mutex_unlock(&(p->queue_lock));  pthread_cond_signal(&(p->queue_ready));  return 1;}  void thread_pool_wait(thread_pool_t *pool){  thread_info_t *thread;  int i=0;  for(i=0;i<pool->num;i++){    thread = (thread_info_t*)(pool->threads+i);    thread->state = THREAD_STATE_EXIT;    pthread_join(thread->id,NULL);  }}void thread_pool_destory(thread_pool_t *pool){  thread_pool_t  *p   = pool;  thread_worker_t *member = NULL;   if(p->is_destroy)    return ;  p->is_destroy = true;  pthread_cond_broadcast(&(p->queue_ready));  thread_pool_wait(pool);  free(p->threads);  p->threads = NULL;  /*銷毀任務列表*/  while(p->head){    member = p->head;    p->head = member->next;    free(member);  }  /*銷毀線程列表*/  thread_info_t *tmp=NULL;  while(p->threads){    tmp = p->threads;    p->threads = tmp->next;    free(tmp);  }   pthread_mutex_destroy(&(p->queue_lock));  pthread_cond_destroy(&(p->queue_ready));  return ;}/*通過線程id,找到對應的線程*/thread_info_t *get_thread_by_id(thread_pool_t *pool,pthread_t id){  thread_info_t *thread=NULL;  thread_info_t *p=pool->threads;  while(p!=NULL){    if(p->id==id)      return p;    p = p->next;  }  return NULL;}  /*每個線程入口函數*/void *thread_excute_route(void *arg){  thread_worker_t *worker = NULL;  thread_info_t  *thread = NULL;   thread_pool_t*  p = (thread_pool_t*)arg;  //printf("thread %lld create success/n",pthread_self());  while(1){    pthread_mutex_lock(&(p->queue_lock));     /*獲取當前線程的id*/    pthread_t pthread_id = pthread_self();    /*設置當前狀態*/    thread = get_thread_by_id(p,pthread_id);     /*線程池被銷毀,并且沒有任務了*/    if(p->is_destroy==true && p->queue_size ==0){      pthread_mutex_unlock(&(p->queue_lock));      thread->state = THREAD_STATE_EXIT;      p->knum ++;      p->rnum --;      pthread_exit(NULL);    }    if(thread){      thread->state = THREAD_STATE_TASK_WAITING; /*線程正在等待任務*/    }    /*線程池沒有被銷毀,沒有任務到來就一直等待*/    while(p->queue_size==0 && !p->is_destroy){      pthread_cond_wait(&(p->queue_ready),&(p->queue_lock));    }    p->queue_size--;    worker = p->head;    p->head = worker->next;    pthread_mutex_unlock(&(p->queue_lock));          if(thread)      thread->state = THREAD_STATE_TASK_PROCESSING; /*線程正在執行任務*/    (*(worker->process))(worker->arg);    if(thread)      thread->state = THREAD_STATE_TASK_FINISHED;  /*任務執行完成*/    free(worker);    worker = NULL;  }}   /*拓展線程*/void *thread_pool_is_need_extend(void *arg){  thread_pool_t *p = (thread_pool_t *)arg;  thread_pool_t *pool = p;  /*判斷是否需要增加線程,最終目的 線程:任務=1:2*/  if(p->queue_size>100){    int incr =0;    if(((float)p->rnum/p->queue_size) < THREAD_BUSY_PERCENT ){      incr = (p->queue_size*THREAD_BUSY_PERCENT) - p->rnum; /*計算需要增加線程個數*/      int i=0;      thread_info_t *tmp=NULL;      thread_pool_t *p = pool;      pthread_mutex_lock(&pool->queue_lock);      if(p->queue_size<100){        pthread_mutex_unlock(&pool->queue_lock);        return ;      }      for(i=0;i<incr;i++){        /*創建線程*/        tmp= (struct thread_info_s*)malloc(sizeof(struct thread_info_s));        if(tmp==NULL){          continue;        }else{          tmp->next = p->threads;          p->threads = tmp;        }        p->num ++;        p->rnum ++;        pthread_create(&(tmp->id),NULL,thread_excute_route,p);        tmp->state = THREAD_STATE_RUN;      }      pthread_mutex_unlock(&pool->queue_lock);    }  }  //pthread_cond_signal(&pool->extend_ready);}pthread_cond_t sum_ready;/*恢復初始線程個數*/void *thread_pool_is_need_recovery(void *arg){  thread_pool_t *pool = (thread_pool_t *)arg;  int i=0;  thread_info_t *tmp = NULL,*prev=NULL,*p1=NULL;  /*如果沒有任務了,當前線程大于初始化的線程個數*/  while(1){    i=0;    if(pool->queue_size==0 && pool->rnum > pool->init_num ){      sleep(5);      /*5s秒內還是這個狀態的話就,銷毀部分線程*/      if(pool->queue_size==0 && pool->rnum > pool->init_num ){        pthread_mutex_lock(&pool->queue_lock);        tmp = pool->threads;        while((pool->rnum != pool->init_num) && tmp){          /*找到空閑的線程*/          if(tmp->state != THREAD_STATE_TASK_PROCESSING){            i++;            if(prev)              prev->next  = tmp->next;            else              pool->threads = tmp->next;            pool->rnum --; /*正在運行的線程減一*/            pool->knum ++; /*銷毀的線程加一*/            kill(tmp->id,SIGKILL); /*銷毀線程*/            p1 = tmp;            tmp = tmp->next;            free(p1);            continue;          }          prev = tmp;          tmp = tmp->next;        }        pthread_mutex_unlock(&pool->queue_lock);        printf("5s內沒有新任務銷毀部分線程,銷毀了 %d 個線程/n",i);      }    }    sleep(5);  }}   /*打印一些信息的*/void *display_thread(void *arg){  thread_pool_t *p =(thread_pool_t *)arg;  thread_info_t *thread = NULL;  int i=0;  while(1){    printf("threads %d,running %d,killed %d/n",p->num,p->rnum,p->knum);  /*線程總數,正在跑的,已銷毀的*/    thread = p->threads;    while(thread){      printf("id=%ld,state=%s/n",thread->id,thread_state_map[thread->state]);      thread = thread->next;    }    sleep(5);  }}

希望本文所述對大家學習C語言程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色偷偷9999www| 亚洲综合成人婷婷小说| 中文字幕日韩免费视频| 亚洲成人激情视频| 日韩视频第一页| 国产精品极品美女在线观看免费| 国产一区二区三区18| 国产精品免费网站| 九九热视频这里只有精品| 夜夜狂射影院欧美极品| 俺去啦;欧美日韩| 夜夜嗨av色综合久久久综合网| 亚洲电影在线看| 国产美女扒开尿口久久久| 亚洲欧美日韩爽爽影院| 亚洲成人动漫在线播放| 日韩欧美国产高清91| 最新国产成人av网站网址麻豆| 狠狠色噜噜狠狠狠狠97| 国产极品精品在线观看| 日韩精品视频免费在线观看| 欧美怡红院视频一区二区三区| 亚洲人成在线观看网站高清| 久久久久久久999| 91精品免费看| 久久影视电视剧免费网站清宫辞电视| 色噜噜亚洲精品中文字幕| 日本国产欧美一区二区三区| 国产在线视频91| 国产精品久久久久久久久久久久久久| 日韩高清电影免费观看完整版| 成人做爰www免费看视频网站| 国产成人亚洲综合91| 91热福利电影| 欧美色视频日本版| 久久精品电影网站| 日韩欧美第一页| 亚洲精选一区二区| 国产午夜精品一区二区三区| 亚洲黄色在线观看| 日韩视频一区在线| 日本高清不卡在线| 国产精品伦子伦免费视频| 国产久一一精品| 欧美激情视频在线观看| 91久久精品国产91性色| 成人欧美一区二区三区黑人孕妇| 亚洲美女中文字幕| 欧美精品电影在线| 中文字幕欧美日韩在线| 日韩av电影免费观看高清| 日韩av在线网站| 97精品一区二区三区| 国产日韩在线免费| 91网在线免费观看| 一区二区三区回区在观看免费视频| 疯狂蹂躏欧美一区二区精品| 亚洲精品不卡在线| 久久久精品免费视频| 国产97人人超碰caoprom| 国产aⅴ夜夜欢一区二区三区| 国产男女猛烈无遮挡91| 日韩中文字幕视频在线| 中文字幕av一区中文字幕天堂| 日韩精品免费综合视频在线播放| 欧美美女操人视频| 成人性生交大片免费看小说| 欧美一区二区影院| 欧美肥老太性生活视频| 国产狼人综合免费视频| 伊人久久久久久久久久久| 国产亚洲欧美日韩一区二区| 91精品国产91久久久久| 久久6免费高清热精品| 黑人巨大精品欧美一区二区三区| 欧美疯狂xxxx大交乱88av| 国产精品免费一区二区三区都可以| 91tv亚洲精品香蕉国产一区7ujn| 中文字幕在线成人| 国产女人18毛片水18精品| 一本色道久久88综合亚洲精品ⅰ| 国产精品99久久久久久人| 97在线看福利| 国产精品爽黄69天堂a| 亚洲精品国产suv| 欧美在线日韩在线| 日韩精品中文字| 国产精品丝袜视频| 91久久在线观看| 国产精品美女免费看| 国产suv精品一区二区三区88区| 国产91色在线播放| 欧美与欧洲交xxxx免费观看| 久久久免费观看| 国产欧美在线播放| 国产九九精品视频| 欧美香蕉大胸在线视频观看| 亚洲精品成a人在线观看| 亚洲精品一区二区三区不| 欧美激情亚洲精品| 中文字幕精品av| 日韩欧美aaa| 在线日韩中文字幕| 久久影院中文字幕| 55夜色66夜色国产精品视频| 国产精品男人的天堂| 91日本视频在线| 一夜七次郎国产精品亚洲| 日韩av在线直播| 中文字幕最新精品| 亚洲欧美精品一区| 激情亚洲一区二区三区四区| 国产精品亚洲综合天堂夜夜| 国产精品美女主播| 色噜噜狠狠狠综合曰曰曰| 欧美影院久久久| 亚洲色图国产精品| 久久精品国产成人| 国产精品美女主播在线观看纯欲| 欧洲成人免费aa| 精品国产一区二区三区久久久狼| 亚洲网在线观看| 亚洲老头老太hd| 中文字幕在线视频日韩| 亚洲白拍色综合图区| 2018中文字幕一区二区三区| 久久噜噜噜精品国产亚洲综合| 国产自产女人91一区在线观看| 色偷偷av一区二区三区乱| 精品在线观看国产| 久久成人在线视频| 亚洲人免费视频| 色偷偷91综合久久噜噜| 欧美午夜精品久久久久久人妖| 久久夜色精品亚洲噜噜国产mv| 欧美亚洲国产精品| 国产精品高清在线观看| 欧美成aaa人片在线观看蜜臀| 97热在线精品视频在线观看| 久久久爽爽爽美女图片| 亚洲精品电影久久久| 国产精品久久一| 亚洲视频专区在线| 日本91av在线播放| 精品在线欧美视频| 中文字幕久久久| 日韩在线播放一区| 亚洲国内精品视频| 亚洲人成网7777777国产| 日本成人黄色片| 国产一区在线播放| 丝袜亚洲欧美日韩综合| 国产精品久久电影观看| 欧美日韩一区二区精品| 色一情一乱一区二区| 亚洲欧洲在线免费| 国产精品高潮呻吟久久av野狼| 久久免费视频观看| 91久久久久久久久| 在线a欧美视频| 久久这里有精品视频| 国产精品91免费在线| 国产网站欧美日韩免费精品在线观看| 伊人亚洲福利一区二区三区|