线程的应用——线程池
1.线程池的实现
1.1 线程池:一堆线程等待着处理任务——非常典型的生产者与消费者模型
1.2 组成:一堆线程(有最大数量上限)+线程安全的任务队列
其他线程将任务抛入线程安全的任务队列中,线程池中的线程从任务队列中获取任务进行处理。
1.3 应用场景:针对大量的请求进行处理的场景(如网络服务器……)
常规情况若要处理请求,使用单执行流效率较低,因此采用多执行流提高处理效率。
1.4 优势
- 线程池中线程创建之后不销毁,而是循环取出任务进行处理,避免了频繁进行线程的创建与销毁带来的时间成本。
- 线程池中的线程以及缓冲区有最大数量限制,避免了峰值压力下资源耗尽的风险。
1.5 实现
线程池的作用是针对大量的任务进行处理。
任务类型多种多样,但是线程入口函数是固定的;如何实现工作线程针对不同的任务进行不同的处理?
1.线程入口函数中分辨任务类型,调用不同的处理接口;
2.其他线程在通过任务队列传入任务时,将任务的处理方法一起传进来,线程池中的线程只需要使用处理方法去处理任务即可,不需要关注什么样的任务如何处理。
typedef void (*handler_t)(int data);
class ThreadTask{ //任务类
int_data; //要处理的数据
handler_t_handler; //处理数据的方法
public:
void Run(){
return_handler(_data);
}
}任务节点类,线程池中的线程获取到任务节点只需要调用Run
class Threadpool{
int thr_num; //线程的数量
BlockQueue_queue; //线程安全的任务队列
void*thr_entry(void *arg){
ThreadTask data;
_queue.pop(&data);
data.Run();
}
public:
Init(int mq,int mt); //初始化以及线程创建
TaskPush(ThreadTask &task); //任务入队
}