线程池(thread pool)是一种多线程的处理形式,处理过程中将任务添加到队列,然后创建线程,启动并处理这些任务。
组成部分
服务器程序可以利用线程技术响应客户端请求。
1、线程池管理器:用于创建并管理线程
2、工作线程:正在处理任务的线程
3、任务接口:每个任务必须实现的借口,以供工作线程调度任务的执行
4、任务队列:用于存放没有被处理的任务。提供一种缓存机制。
线程池的实现
- 用于执行大量相对短暂的任务
- 当任务增加的时候能够动态的增加线程池中线程的数量直到到达一个阈值
- 当任务执行完毕的时候,能够动态的销毁线程池中的线程
- 该线程池的实现本质上也是生产者与消费者模型的应用。生产者线程向任务队列中添加任务,一旦队列有任务到来,如果有等待线程就唤醒来执行任务,如果没有等待线程并且线程数没有达到阈值,就创建新线程来执行任务。
1、下面是任务结构体的组成:
// 任务结构体,将任务放入队列由线程池中的线程执行 typedef struct task { void *(*run)(void *arg); //任务回调函数 void *arg; //回调函数参数 struct task *next; }task_t;
2、下面是线程池结构体的组成:
//线程池结构体 typedef struct threadpool { condition_t ready; //任务准备就绪或者线程池销毁通知 task_t *first; //任务队列头指针 task_t *last; //任务队列尾指针 int count; //线程池中当前线程数 int idle; //线程池中当前正在等待任务的线程数 int max_threads; //线程池中最大允许的线程数 int quit; //销毁线程池的时候置1 }threadpool_t;3、线程池提供的接口函数
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); //销毁线程池