目录
本文仅代表个人观点,如有疏漏之处望评论区回复指正,感谢!
线程池
what
一种多线程的使用和管理模式,大多用于高并发服务器上,能够合理有效地利用多线程模型高并发服务器上的资源,多用于linux高并发服务器的场景下,与epoll模型结合使用。
why
- 服务器角度:解决多线程维护的问题。分为两方面,线程创建数量控制与线程资源的复用。在数量控制方面,线程过多会带来调度的额外开销,在线程池中通过主控线程可以合理维护线程数量;在线程资源的复用方面,避免了处理短时间任务时频繁创建销毁线程的消耗,处理完成任务后回归线程池,通过主控线程管理,充分利用内核资源。
- 客户端角度:解决客户端连接服务器的延时问题。每一个客户端连接服务器都会分配一个线程去处理IO任务,如果没有预先创建好的线程和主控线程合理维护,客户端连接时需要等待服务器创建线程产生延时,影响用户体验。采用线程池,服务器可以迅速响应客户端的连接,分配线程处理任务。
how
解读线程池的设计思路以及设计过程中遇到的问题。
整体设计
分为三部分:管理线程(负责线程数的扩容与缩减)、任务队列(负责向任务队列填装任务)、工作线程(负责从任务队列取任务并处理)。
其中任务队列、工作线程采用生产者-消费者模型,用互斥量+条件变量实现线程同步。
工作情况分析
1.线程池刚刚初始化,任务队列中没有任务,线程池中只有默认线程数(假设为3),线程处于空闲等待状态。
2.添加小于默认线程数量的任务,线程池开始工作,此时线程池