多线程:https://paul.pub/cpp-concurrency/
https://zhuanlan.zhihu.com/p/367309864
https://blog.csdn.net/qq_48930954/article/details/124834084
解决的问题
需要解决的是多线程编实现并发和并行出现的问题;
(1)降低资源消耗。多线程不能够线程复用,创建销毁线程开销,线程切换开销等;
(2)更快的响应任务。创建线程需要时间,响应任务不够及时。
(3)更可靠的线程管理。线程是稀缺资源,不能无限创建,使用线程池可进行统一的分配和管理。
基本原理
相当于实现一个线程与任务管理工具(抽象线程池,线程,任务的模型)。
预先创建好固定数量的线程(某些线程池模型线程数量可变化),然后在任务请求线程时对线程进行分配和管理,线程池的线程执行完一个任务后再执行另一个任务。
(1) 创建任务队列数据结构,实现添加任务,取出任务方法。
需要支持多线程,所以需要线程锁。
任务是一个函数,输入输出需要支持任意类型。
(2) 添加任务时需要通知线程池内worker开始工作。
添加任务时,可能部分worker在等待工作,可能所有worker都在工作中,需要使用某种机制触发其工作。
(1)实现多个woker的线程池,没有任务时,woker在等待工作(不占用cpu),有任务时,woker会及时的被触发响应工作。
以固定线程数量的线程池为例:
step1:创建一个线程池,包含N个线程。
step2:每一个线程中的woker被启动,开始运行。
step3:注册任务时,任务被添加进任务队列,并触发某个等待的woker进行任务响应。如果没有空闲worker,那么直到存在空闲worker后就会进行任务响应。
step4: 任务响应时,任务被取出任务队列,然后执行完成,worker的一次工作结束。