linux c 线程池(互斥变量+条件变量+模块化实现)(V1.0)
来源:互联网 发布:淘宝售后多久不能申请 编辑:程序博客网 时间:2024/06/05 03:46
/***
经过测试性能远优于上一种实现方式,见http://blog.csdn.net/yangguo_2011/article/details/9370759感兴趣的可以使用两种模式进行测试,观察系统内存和CPU使用情况,堆栈情况等***//* * Copyright (C) 2013 yangguo <yangguo@yangguo-ubuntu 12.4LTS> * project name:commonModel * created time:2013-07-20-15.00 * company:www.dbc.com.cn * support email:guoyang2011@gmail.com * version:1.0 * main function:None * modify information:None */#include ""comdbcyangg_ThreadPool.h"int threadCount=0;static void *ThreadRun(void *arg);void poolInit(struct ThreadPool *pool,const int maxThreadNum){ //pool=(struct ThreadPool *)malloc(sizeof(struct ThreadPool)); //pthread_rwlock_init(&(pool->rwlock),NULL); pthread_cond_init(&(pool->cond),NULL); pthread_mutex_init(&(pool->mutex),NULL); pthread_cond_init(&(pool->freeCond),NULL); pthread_mutex_init(&(pool->freeMutex),NULL); pool->maxMemorySize=(int)(maxThreadNum*1.5); pool->freeTask=NULL; pool->queueHead=NULL; pool->maxThreadNum=maxThreadNum; pool->curQueueSize=0; pool->totalQueueSize=0; pool->shutdown=0; pool->threadid=(pthread_t *)malloc(maxThreadNum*sizeof(pthread_t)); int i=0; pthread_setconcurrency(maxThreadNum);//兼容问题 for(i=0;i<maxThreadNum;i++) { pthread_create(&(pool->threadid[i]),NULL,ThreadRun,pool); }}struct ThreadWorker *AddTaskToList(struct ThreadWorker *listTask,struct ThreadPool *pool,const void *(*TaskRun)(void *arg),const void *arg){ struct ThreadWorker *newTask=NULL; pthread_mutex_lock(&(pool->freeMutex)); while(pool->freeTask==NULL&&(pool->totalQueueSize)>=(pool->maxMemorySize)) { pthread_cond_wait(&(pool->freeCond),&(pool->freeMutex)); } if(pool->freeTask!=NULL) { newTask=pool->freeTask; pool->freeTask=pool->freeTask->next; } pthread_mutex_unlock(&(pool->freeMutex)); if(newTask==NULL) { newTask=(struct ThreadWorker *)malloc(sizeof(struct ThreadWorker)); pool->totalQueueSize++; } newTask->TaskRun=TaskRun; newTask->arg=arg; newTask->next=listTask; listTask=newTask; return listTask;}int PoolAddTasks(struct ThreadPool *pool,const struct ThreadWorker *listTask,const int listTaskNum){ //pthread_rwlock_wrlock(&(pool->rwlock)); int taskNum=0; pthread_mutex_lock(&(pool->mutex)); struct ThreadWorker *member=pool->queueHead; if(member!=NULL) { while(member->next!=NULL) { member=member->next; } member->next=listTask; } else { pool->queueHead=listTask; } if(pool->queueHead!=NULL) { pool->curQueueSize+=listTaskNum; } taskNum=pool->curQueueSize; pthread_mutex_unlock(&(pool->mutex)); pthread_cond_signal(&(pool->cond)); printf("................<current Task count %d>..............\n",taskNum); return 0;}static void *ThreadRun(void *arg){ int taskThreadNum=threadCount++; struct ThreadPool *pool=(struct ThreadPool *)arg; struct ThreadWorker *curWorker=NULL; int shutdown=0; while(pool!=NULL) { pthread_mutex_lock(&(pool->mutex)); while(pool->curQueueSize==0&&!pool->shutdown) { pthread_cond_wait(&(pool->cond),&(pool->mutex)); } shutdown=pool->shutdown; if(pool->curQueueSize!=0&&pool->queueHead!=NULL) { pool->curQueueSize--; curWorker=pool->queueHead; pool->queueHead=curWorker->next; } else { pool->curQueueSize=0; } pthread_mutex_unlock(&(pool->mutex)); //pthread_rwlock_unlock(&(pool->rwlock)); if(curWorker==NULL&&shutdown!=0)//任务链表为空且收到销毁线池命令时终止线程 { printf("+++++++++++++++++++Thread [%d] end working!++++++++++++",taskThreadNum); break; } if(curWorker!=NULL) { printf(">>>>>>>>>>>>Thread [%d] start working!<<<<<<<<<<\n",taskThreadNum); (*(curWorker->TaskRun))(&taskThreadNum); pthread_mutex_lock(&(pool->freeMutex)); curWorker->next=pool->freeTask; pool->freeTask=curWorker; //printf("*********************free resource count %d ******************\n",pool->curFreeTaskSize); //free(curWorker); pthread_mutex_unlock(&(pool->freeMutex)); pthread_cond_signal(&(pool->freeCond)); curWorker=NULL; } } pthread_exit(0);}int PoolDestroy(struct ThreadPool *pool){ if(pool->shutdown) { return -1; } //pthread_rwlock_wrlock(&(pool->rwlock)); pthread_mutex_lock(&(pool->mutex)); pool->shutdown=1; pthread_mutex_unlock(&(pool->mutex)); //pthread_rwlock_unlock(&(pool->rwlock)); pthread_cond_broadcast(&(pool->cond)); printf("start free resource!\n"); int i; for(i=0;i<pool->maxThreadNum;i++) { printf("free resouce Thread ID=%d!\n",i); pthread_join(pool->threadid[i],NULL); } free(pool->threadid); struct ThreadWorker *deleteHeader=NULL; while(pool->queueHead!=NULL) { deleteHeader=pool->queueHead; pool->queueHead=pool->queueHead->next; free(deleteHeader); } deleteHeader=NULL; while(pool->freeTask!=NULL) { deleteHeader=pool->freeTask; pool->freeTask=pool->freeTask->next; free(deleteHeader); } pthread_mutex_destroy(&(pool->mutex)); pthread_cond_destroy(&(pool->cond)); // pthread_rwlock_destroy(&(pool->rwlock)); free(pool); return 0;}//////////////////////////////////////////header://///////////////////* * Copyright (C) 2013 yangguo <yangguo@yangguo-ubuntu 12.4LTS> * project name:commonModel * created time:2013-07-20-16.50 * company:www.dbc.com.cn * support email:guoyang2011@gmail.com * version:0.1 * main function:None * modify information:None */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <pthread.h>struct ThreadWorker{ void *(*TaskRun)(void *arg); void *arg; struct ThreadWorker *next;};struct ThreadPool{ // pthread_rwlock_t rwlock; int shutdown; int maxThreadNum; int maxMemorySize; int curQueueSize; int totalQueueSize; pthread_t *threadid; struct ThreadWorker *queueHead; struct ThreadWorker *freeTask; pthread_cond_t cond; pthread_cond_t freeCond; pthread_mutex_t mutex; pthread_mutex_t freeMutex;};void poolInit(struct ThreadPool *pool,const int maxThreadNum);struct ThreadWorker *AddTaskToList(struct ThreadWorker *listTask,struct ThreadPool *pool,const void *(*TaskRun)(void *arg),const void *arg);int PoolAddTasks(struct ThreadPool *pool,const struct ThreadWorker *listTask,const int listTaskNum);int PoolDestroy(struct ThreadPool *pool);////////////////////////////////////test:///////////////////////* * Copyright (C) 2013 yangguo <yangguo@yangguo-ubuntu 12.4LTS> * project name:commonModel * created time:2013-07-20-16.53 * company:www.dbc.com.cn * support email:guoyang2011@gmail.com * version:0.1 * main function:None * modify information:None */#include "comdbcyangg_ThreadPool.h"void *myfunc(void *arg);int main(void){ struct ThreadPool *pool=(struct ThreadPool *)malloc(sizeof(struct ThreadPool)); int *num=(int *)malloc(sizeof(int)*100000); int i=0,addListCount=0; poolInit(pool,200); struct ThreadWorker *listTask=NULL; struct ThreadWorker *newTask; listTask=newTask; for(i=0;i<100000;i++) { num[i]=i; addListCount++; listTask=AddTaskToList(listTask,pool,myfunc,&num[i]); if(i%40==0||i==99999) { printf("All Task add queue %d\n",i); PoolAddTasks(pool,listTask,addListCount); listTask=NULL; addListCount=0; } //PoolAddTask(myfunc,&num[i]); } PoolDestroy(pool); free(num); exit(0);}void *myfunc(void *arg){ int sleepTime=rand()%2; //printf("task %d start!sleep time %d\n",*((int *)arg),sleepTime); sleep(sleepTime); return (void *)0;}