一、线程池资源。 线程池接口设计说明书.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、销毁线程池。 关闭线程池,唤醒所有小孩起来退出。