本文主要是介绍网路服务器——线程池技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、线程池技术
- 二、使用原理
- 三、优点
- 总结
一、线程池技术
- 预创建原则,线程池内部准备线程备用, 不宜过多。
- 线程应该重用性,可以一对多处理任务或服务不同的客户端。
- 处理单元(线程)数量并不固定,动态扩容与缩减(任务量)。
- 设计灵活的任务传递方式与任务接口,线程可以执行不同种类的任务,不能将线程工作固定。
二、使用原理
线程与线程之间有一个任务传递方式:生产者——消费者。
监听线程就是生产者,处理线程就是消费者。通过条件变量+互斥锁实现。
生产者与消费者之间有一个任务队列(怎么实现都可以,我用的是环形队列)。
条件变量需要创建工作条件:生产者把任务放到队列中来,消费者拿走处理。
生产者工作条件:任务队列非满。满则挂起。添加完毕,唤醒消费者。
消费者条件相反:任务队列非空获取任务执行,为空则挂起。执行任务完毕,唤醒生产者继续生产。
任务队列是共享资源,多线程访问需要互斥。(任务队列里是函数指针队列)
线程池技术为多线程技术
主线程(生产者)负责epoll,负责工作:
- epoll监听树创建。
- 设置第一次监听
- 阻塞多轮监听
如何处理协议:通过协议映射表(函数指针列表),通过不同的协议编号,执行不同的函数。
生产者访问树更多是读访问,知道所有文件描述符轮询监听。
消费者也要访问树,要去执行链接,将sock放到树上。链接断开,将sock从树上移除。
还要找个管理者负责扩容和缩减,负责管理消费者。管理线程状态,完成扩容和缩减任务。
三、优点
- 提高资源利用率:线程池可以重复利用已经创建了的线程
- 提高响应速度:因为当线程池中的线程没有超过线程池的最大上限时,有的线程处于等待分配任务状态,当任务到来时,无需创建线程就能被执行。
- 具有可管理性:线程池会根据当前系统特点对池内的线程进行优化处理,减少创建和销毁线程带来的系统开销。
总结
一共仨身份:一个生产者线程、一个管理者和n个消费者线程,有一个监听队列,有一个监听树。要做一个线程的消息映射表,不同sock就绪,执行不同的任务。读取不同客户端请求还要对协议进行再一次解析。
这篇关于网路服务器——线程池技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!