一、代码实现
1、任务链表
typedef struct tasklist //任务链表
{
void (* taskfun)(void * arg);
void * taskarg;
struct tasklist * next;
}NODE, *PNODE;
2、线程池及内部的基本参数
struct threadpool
{
pthread_t *id; //多个线程ID号
unsigned int threadnum; //线程个数
unsigned int tasknum; //任务个数
PNODE phead; //任务链表头
pthread_mutex_t poolmutex; //互斥锁
pthread_cond_t poolcond; //环境变量
int threadflag;//线程池销毁标志
}; //线程池
3、线程池的初始化
//参数:head:链表头 ;n:需要初始n条线程
struct threadpool *pool_init(PNODE head,int n) //线程池初始化
{
struct threadpool *mypool = malloc(sizeof(struct threadpool));
mypool->id = malloc(n*sizeof(pthread_t));
mypool->threadnum=n;
mypool->phead=head;
mypool->threadflag=1;
pthread_mutex_init(&(mypool->poolmutex),NULL); //初始化互斥锁
pthread_cond_init(&(mypool->poolcond),NULL);//初始化环境变量
for (int i = 0; i < n; ++i)
{
pthread_create(&(mypool->id[i]),NULL,gettask,mypool);
}
return mypool;
}
4、往任务链表中添加任务
void task_add(void (*sometask)(void *arg),void * somearg,struct threadpool *pool) //加入任务
{
PNODE p;
p=pool->phead;
struct tasklist *newtask = malloc(sizeof(NODE));
newtask->taskfun=sometask;
newtask->taskarg=somearg;
newtask->next=NULL;
pthread_mutex_lock(&(pool->poolmutex));
while(p->next!=NULL)
{ p=p->next; }
p->next=newtask;
pool->tasknum++;
pthread_mutex_unlock(&(pool->poolmutex));
pthread_cond_signal(&(pool->poolcond));
}
5、线程获取任务链表中的任务
void *gettask(void *arg)//n个线程共用的功能函数
{
struct threadpool *threadp=(struct threadpool *)arg;
while(1)
{
pthread_mutex_lock(&(threadp->poolmutex)); //上锁
while(threadp->tasknum<=0 && threadp->threadflag==1)//任务数量为0
{
pthread_cond_wait(&(threadp->poolcond),&(threadp->poolmutex));
}
if (threadp->tasknum<=0 && threadp->threadflag==0)
{
pthread_mutex_unlock(&(threadp->poolmutex)); //解锁
pthread_exit(NULL);
}
//遍历任务链表,从任务链表的头部取出任务然后处理,处理完了再删除任务节点
PNODE ptask = threadp->phead->next; // 取节点
threadp->phead->next=ptask->next; //删除节点
threadp->tasknum--;
pthread_mutex_unlock(&(threadp->poolmutex));
(ptask->taskfun)(ptask->taskarg); //调用线程要执行的函数,右边是要传给函数的参数
free(ptask);
}
}