设为首页 加入收藏

TOP

一个线程池的简单的实现(一)
2015-07-24 07:07:49 来源: 作者: 【 】 浏览:108
Tags:一个 线程 池的 简单 实现
线程池实现: 用于执行大量相对短暂的任务 当任务增加的时候能够动态的增加线程池中线程的数量直到达到一个阈值。 当任务执行完毕的时候,能够动态的销毁线程池中的线程
该线程池的实现本质上也是生产者与消费模型的应用。生产者线程向任务队列中添加任务,一旦队列有任务到来,如果有等待线程就唤醒来执行任务,如果没有等待线程并且线程数没有达到阈值,就创建新线程来执行任务。

contion.h #ifndef _CONDITION_H_
#define _CONDITION_H_


#include


typedef struct condition
{
pthread_mutex_t pmutex;
pthread_cond_t pcond;
} condition_t;


int condition_init(condition_t *cond);
int condition_lock(condition_t *cond);
int condition_unlock(condition_t *cond);
int condition_wait(condition_t *cond);
int condition_timedwait(condition_t *cond, const struct timespec *abstime);
int condition_signal(condition_t *cond);
int condition_broadcast(condition_t *cond);
int condition_destroy(condition_t *cond);


#endif /* _CONDITION_H_ */

condition.c #include "condition.h"


int condition_init(condition_t *cond)
{
int status;
if ((status = pthread_mutex_init(&cond->pmutex, NULL)))
return status;


if ((status = pthread_cond_init(&cond->pcond, NULL)))
return status;


return 0;
}


int condition_lock(condition_t *cond)
{
return pthread_mutex_lock(&cond->pmutex);
}


int condition_unlock(condition_t *cond)
{
return pthread_mutex_unlock(&cond->pmutex);
}


int condition_wait(condition_t *cond)
{
return pthread_cond_wait(&cond->pcond, &cond->pmutex);
}


int condition_timedwait(condition_t *cond, const struct timespec *abstime)
{
return pthread_cond_timedwait(&cond->pcond, &cond->pmutex, abstime);
}




int condition_signal(condition_t *cond)
{
return pthread_cond_signal(&cond->pcond);
}


int condition_broadcast(condition_t* cond)
{
return pthread_cond_broadcast(&cond->pcond);
}


int condition_destroy(condition_t* cond)
{
int status;
if ((status = pthread_mutex_destroy(&cond->pmutex)))
return status;


if ((status = pthread_cond_destroy(&cond->pcond)))
return status;


return 0;
}

\
threadpool.h #ifndef _THREAD_POOL_H_
#define _THREAD_POOL_H_


#include "condition.h"


// 任务结构体,将任务放入队列由线程池中的线程来执行
typedef struct task
{
void *(*run)(void *arg); // 任务回调函数
void *arg; // 回调函数参数
struct task *next;
} task_t;


// 线程池结构体
typedef struct threadpool
{
condition_t ready; //任务准备就绪或者线程池销毁通知
task_t *first; //任务队列头指针
task_t *last; //任务队列尾指针
int counter; //线程池中当前线程数
int idle; //线程池中当前正在等待任务的线程数
int max_threads; //线程池中最大允许的线程数
int quit; //销毁线程池的时候置1
} threadpool_t;


// 初始化线程池
void threadpool_init(threadpool_t *pool, int threads);
// 往线程池中添加任务
void threadpool_add_task(threadpool_t *pool, void *(*run)(void *arg), void *arg);
// 销毁线程池
void threadpool_destroy(threadpool_t *pool);


#endif /* _THREAD_POOL_H_ */

threadpool.c #include "threadpool.h"
#include
#include
#include
#include
#include


void *thread_routine(void *arg)
{
struct timespec abstime;
int timeout;
printf("thread 0x%x is starting\n", (int)pthread_self());
threadpool_t *pool = (threadpool_t *)arg;
while (1)
{
timeout = 0;
condition_lock(&pool->ready);
pool->idle++;
// 等待队列有任务到来或者线程池销毁通知
while (pool->first == NULL && !pool->quit)
{
printf("thread 0x%x is waiting\n", (int)pthread_self());
//condition_wait(&pool->ready);
clock_gettime(CLOCK_REALTIME, &abstime);
abstime.tv_sec += 2;
int status = condition_timedwait(&pool->ready, &abstime);
if (status == ETIMEDOUT)
{
printf("thread 0x%x is wait timed
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇用二叉链表实现二叉查找树(二) 下一篇C++编译与链接(1)-编译与链接过..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: