线程
实现方式
线程有三种实现方式,分别是内核级线程、用户级线程和组合型线程。
- 内核级线程:拥有一个内核对象和一个栈,占据着操作系统的一块内核空间,其创建、阻塞、切换和销毁都访问操作系统接口,由内核来完成,应用程序不进行线程管理。
每个用户线程在其生命周期内被绑定到一个内核线程,一旦用户线程终止,两个线程都被系统销毁。这种模式称为“一对一”线程映射。 - 用户级线程:在用户空间实现,对于线程的创建、销毁、同步与通信等,无需内核的支持。
内核由于对用户线程一无所知,对于采用用户线程的进程,按照单线程进程进行管理,即同一进程的线程只有在同一处理机下分时复用。 - 组合型线程:实质是用户级线程与内核级线程的组合。多个用户级线程被映射到单个或者多个内核级线程,每个内核级线程具有一个可以轮流使用的用户级线程集合。
适用场景
对于独立或者并发执行任务,考虑采用内核级线程;对于有序执行任务,考虑运用用户级线程;而对于综合的复杂应用场景,考虑使用组合型线程。
线程池
线程池作为独立模块,采用异步方式交互,分为线程池类、线程类、队列类模板三部分。
类设计
线程池类分为守护线程和接口设计
- 守护线程:负责给空闲线程分派任务,在销毁自身之时销毁所有线程。当任务队列为空,或者无空闲线程时,进入阻塞状态。
- 接口:线程池的访问方法集,包括创建线程池,销毁线程池,调整线程数量,向任务队列添加任务等。在添加任务或者增加空闲线程时,若守护线程处于阻塞状态,则唤醒守护线程。
线程类分为工作线程和接口设计
- 工作线程:可以反复执行任务。创建之后进入阻塞状态,由守护线程唤醒并分派任务。执行任务之后,主动于任务队列获取任务。若任务队列为空,进入阻塞状态。
- 接口:线程的访问方法集,包括创建线程,销毁线程,配置任务,唤醒工作线程等。
队列类模板用以创建任务队列
- 任务队列:线程池的缓冲机制,供线程互斥获取任务,与窗口的事件循环相似。
任务形式
任务形式指任务方法体的特征,包括返回类型、参数列表,而参数的类型、数量和顺序决定参数列表。
队列类模板几乎不限制任务形式,而线程池类和线程类不如类模板灵活,由二者共同指定任务形式。
为适配函数指针、函数对象和匿名函数(Lambda),并且支持回调,任务形式采用函数子对。
目录
双缓冲队列模板
线程类
线程池类
线程池性能测试
源码地址:
gitee: https://gitee.com/eterfree/ThreadPool
github: https://github.com/freedomandjustice/ThreadPool