一个简单的线程池
[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++ ,