系统编程之线程池
在进程中,创建多个线程,每当有任务执行时,直接调用已创建好的线程执行,不需要额外创建线程。
实际情况是线程的数量受限于计算机内存不能创建太多,那么就可以利用线程池设置线程数量上限
那么如何设计这个任务工作链表?
单项不循环链表
struct task_list{
route *fuc;//线程执行任务函数指针,该指针指向返回值void*,参数为void*的函数
void *arg//线程执行任务函数的参数
struct task_list *next;
};
结构体成员是函数怎么定义?
自定义一个函数类型
typedef void *(route)(void *);
//定义了一个route为返回值void*,参数为void*的函数
如何设计线程池?
为避免多个线程争抢同一个任务,使用互斥锁
为让线程池中等待的线程知道有任务需要他们,使用条件变量通知等待的线程
struct pthread_pool{
pthread_mutex_t m;//互斥锁
pthread_cond_t v;//条件变量
struct task_list *list;//任务工作链表,
//malloc分配内存空间后,用于保存链表头部
pthread_t *tid;//线程数组
//malloc分配内存空间后,再确定数组大小;
unsigned int active_pthread;//正在运行的子线程个数
unsigned int wait_pthread;//正在等待子线程个数
bool shutdown;//退出线程池的标志位
};