当前位置:编程学习 > C/C++ >>

一个简单的线程池

[cpp]
//threadpool.h    
#ifndef     __THREADPOOL_H__    
#define     __THREADPOOL_H__    
#include    <pthread.h>    
typedef void* (*task_fun)(void*);   
//用链表来维护等待任务    
typedef struct threadtask   
{   
    //任务的执行函数    
    task_fun task;   
    //执行函数的参数    
    void* arg;   
    //下一节点    
    struct threadtask* next;   
}THREAD_TASK;   
   
void* thr_fun(void* arg);//每个线程执行的函数    
int init_task(void);//初始化等待任务链表    
int init_pool(void);//初始化线程池    
//向任务链表中添加任务    
int add_task(task_fun task, void* arg);   
int destroy_poll(void);   
#endif   

//threadpool.h 
#ifndef     __THREADPOOL_H__ 
#define     __THREADPOOL_H__ 
#include    <pthread.h> 
typedef void* (*task_fun)(void*); 
//用链表来维护等待任务 
typedef struct threadtask 

    //任务的执行函数 
    task_fun task; 
    //执行函数的参数 
    void* arg; 
    //下一节点 
    struct threadtask* next; 
}THREAD_TASK; 
 
void* thr_fun(void* arg);//每个线程执行的函数 
int init_task(void);//初始化等待任务链表 
int init_pool(void);//初始化线程池 
//向任务链表中添加任务 
int add_task(task_fun task, void* arg); 
int destroy_poll(void); 
#endif 

 

[cpp]
//threadpool.c    
//对于基本不出现的错误不进行检测    
#include    <stdio.h>    
#include    <stdlib.h>    
#include    <unistd.h>    
#include    <string.h>    
#include    "threadpool.h"    
//线程池中最多允许的线程数    
#define     THREADPOOLSIZE 3    
//当前等待任务的个数    
static unsigned int taskwaittingnum=0;   
//taskwaittingnum的锁    
pthread_mutex_t g_nummutex= PTHREAD_MUTEX_INITIALIZER;   
//等待任务队列的锁    
pthread_mutex_t g_taskmutex=PTHREAD_MUTEX_INITIALIZER;   
THREAD_TASK* g_pTask=NULL;   
pthread_t tid[THREADPOOLSIZE];   
//是否销毁线程池    
static int isShut=0;   
void* thr_fun(void* arg)   
{   
    task_fun task;   
    void* funarg=NULL;   
    THREAD_TASK* ptmp=NULL;   
       
    while(1)   
    {   
        //如果要销毁线程池,跳出while循环    
        if( 1==isShut )    
        {   
            break;//跳出while循环    
        }   
        pthread_mutex_lock(&g_nummutex);   
        //如果当前没有任务需要调度,休眠5000微妙    
        if( 0==taskwaittingnum )   
        {   
            pthread_mutex_unlock(&g_nummutex);   
            usleep(5000);   
            continue;   
        }   
        //当前有任务调度    
        else   
        {   
            //需要写入链表,所以要锁定链表    
            pthread_mutex_lock(&g_taskmutex);   
            task=g_pTask->next->task;   
            funarg=g_pTask->next->arg;   
            ptmp=g_pTask->next;   
            g_pTask->next=ptmp->next;   
            taskwaittingnum--;   
            pthread_mutex_unlock(&g_taskmutex);   
            pthread_mutex_unlock(&g_nummutex);   
               
            free(ptmp);   
            ptmp=NULL;   
            (*task)(funarg);   
        }   
    }   
    pthread_exit(NULL);   
}   
//初始化任务链表,首个节点不用来存储任务    
int init_task(void)   
{   
    g_pTask=(THREAD_TASK*)malloc(sizeof(THREAD_TASK));   
    if( NULL==g_pTask )   
    {   
        printf("init_task malloc fails./n");   
        return -1;   
    }   
    memset(g_pTask, 0, sizeof(THREAD_TASK));   
    g_pTask->next=NULL;   
    return 0;   
}   
//初始化线程池    
int init_pool(void)   补充:软件开发 , C++ ,

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,