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;}


原创粉丝点击