//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.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)
{
int ret;
int i;
for( i=0 ; i<THREADPOOLSIZE ; i++ )
{
ret=pthread_create(tid+i, NULL, thr_fun, NULL);
if( ret!=0 )
{
printf("init_pool pthread_create:/n%s/n", strerror(ret));
return -1;
}
}
return 0;
}
int add_task(task_fun task, void* arg)
{
THREAD_TASK* ptmp=NULL;
pthread_mutex_lock(&g_nummutex);
pthread_mutex_lock(&g_taskmutex);
ptmp=g_pTask;
while( ptmp->next!=NULL )
{
ptmp=ptmp->next;
}
ptmp->next=(THREAD_TASK*)malloc(sizeof(THREAD_TASK));
if( NULL==ptmp->next )
{
printf("add_task malloc fails/n");
return -1;
}
ptmp=ptmp->next;
ptmp->task=task;
ptmp->arg=arg;
ptmp->next=NULL;
taskwaittingnum++;
pthread_mutex_unlock(&g_nummutex);
pthread_mutex_unlock(&g_taskmutex);
return 0;
}
int destroy_pool(void)
{
isShut=1;
pthread_mutex_destroy(&g_nummutex);
pthread_mutex_destroy(&g_taskmutex);
return 0;
}
//用来测试的main.c
#include <stdio.h>
#include "threadpool.h"
void* task1(void* arg)
{
printf("task1正在运行!/n");
sleep(10);
printf("task1运行结束!/n");
return NULL;
}
void* task2(void* arg)
{
printf("task2正在运行!/n");
sleep(10);
printf("task2运行结束!/n");
return NULL;
}
void* task3(void* arg)
{
printf("task3正在运行!/n");
printf("task3运行结束!/n");
return NULL;
}
void* task4(void* arg)
{
printf("task4正在运行!/n");
printf("task4运行结束!/n");
return NULL;
}
int main(int argc, char *argv[])
{
init_task();
init_pool();
add_task(task1, NULL);
add_task(task2, NULL);
add_task(task3, NULL);
add_task(task4, NULL);
sleep(30);
destroy_pool();
return 0;
}