一、线程池资源。
线程池接口设计说明书.doc -> 关于线程池中接口使用:参数,头文件,原型,返回值..
pool_test/ -> 线程池源码以及小例子。
main.c -> 使用线程池接口实现的一个小例子。
thread_pool.c -> 线程池源码
thread_pool.h -> 线程池函数声明,结构体声明,宏定义。
二、线程池原理。
1、 线程池意义?
可以同时处理多个任务。
2、 线程池机制?
线程池好比是一家公司,一边不断接收任务,员工就一边不断去处理任务。
生产者: 专门投放任务到线程池的任务。
消费者: 处理任务的这些线程。
3、 如何描述一个线程池状态? -> 结构体
struct task
{
void *(*do_task)(void *arg); //函数指针
void *arg;//参数
struct task *next;
};
typedef struct thread_pool
{
pthread_mutex_t lock; //互斥锁
pthread_cond_t cond; //条件变量
bool shutdown; //线程池标志位: true -> 关闭 flase -> 开启
struct task *task_list;//指向一条任务链表的链表头
pthread_t *tids; //存储全部线程的ID号。
unsigned max_waiting_tasks; //最大的等待任务个数
unsigned waiting_tasks; //当前正在等待任务个数
unsigned active_threads; //当前线程池中有多少条线程
}thread_pool;
三、分析函数接口。
1、 初始化线程池。 -> init_pool()
原型:
bool init_pool(thread_pool *pool, unsigned int threads_number);
参数:
pool:线程池的地址
threads_number:线程池初始化线程的条数。
功能: 初始化一些值,设置一些值,创建线程。
2、 投放任务。 -> add_task()
原型:
bool add_task(thread_pool *pool,void *(*do_task)(void *arg), void *arg)
参数:
pool:线程池的地址。
do_task: 需要处理的任务的函数接口。
arg:传递给函数接口的参数
功能:将新任务弄成一个节点,然后将节点尾插为任务队列后面。
3、 线程的例程。
功能:拿走任务队列中的一个节点,然后执行该节点中的函数。
4、 添加线程。 -> add_thread()
int add_thread(thread_pool *pool, unsigned additional_threads)
参数:
pool:线程池的地址
additional_threads:线程池新增线程的条数。
功能: 添加一个新的线程到线程池。
5、 删除线程。 -> remove_thread()
int remove_thread(thread_pool *pool, unsigned int removing_threads)
参数:
pool:线程池的地址
removing_threads:线程池删除线程的条数。
功能: 删除线程池中的一些线程。
6、销毁线程池。
关闭线程池,唤醒所有小孩起来退出。