线程池设计原理

线程

实现方式

线程有三种实现方式,分别是内核级线程、用户级线程和组合型线程。

  • 内核级线程:拥有一个内核对象和一个栈,占据着操作系统的一块内核空间,其创建、阻塞、切换和销毁都访问操作系统接口,由内核来完成,应用程序不进行线程管理。
    每个用户线程在其生命周期内被绑定到一个内核线程,一旦用户线程终止,两个线程都被系统销毁。这种模式称为“一对一”线程映射。
  • 用户级线程:在用户空间实现,对于线程的创建、销毁、同步与通信等,无需内核的支持。
    内核由于对用户线程一无所知,对于采用用户线程的进程,按照单线程进程进行管理,即同一进程的线程只有在同一处理机下分时复用。
  • 组合型线程:实质是用户级线程与内核级线程的组合。多个用户级线程被映射到单个或者多个内核级线程,每个内核级线程具有一个可以轮流使用的用户级线程集合。

适用场景

对于独立或者并发执行任务,考虑采用内核级线程;对于有序执行任务,考虑运用用户级线程;而对于综合的复杂应用场景,考虑使用组合型线程。

线程池

线程池作为独立模块,采用异步方式交互,分为线程池类、线程类、队列类模板三部分。

类设计

线程池类分为守护线程和接口设计

  • 守护线程:负责给空闲线程分派任务,在销毁自身之时销毁所有线程。当任务队列为空,或者无空闲线程时,进入阻塞状态。
  • 接口:线程池的访问方法集,包括创建线程池,销毁线程池,调整线程数量,向任务队列添加任务等。在添加任务或者增加空闲线程时,若守护线程处于阻塞状态,则唤醒守护线程。

线程类分为工作线程和接口设计

  • 工作线程:可以反复执行任务。创建之后进入阻塞状态,由守护线程唤醒并分派任务。执行任务之后,主动于任务队列获取任务。若任务队列为空,进入阻塞状态。
  • 接口:线程的访问方法集,包括创建线程,销毁线程,配置任务,唤醒工作线程等。

队列类模板用以创建任务队列

  • 任务队列:线程池的缓冲机制,供线程互斥获取任务,与窗口的事件循环相似。

任务形式

任务形式指任务方法体的特征,包括返回类型、参数列表,而参数的类型、数量和顺序决定参数列表。
队列类模板几乎不限制任务形式,而线程池类和线程类不如类模板灵活,由二者共同指定任务形式。
为适配函数指针、函数对象和匿名函数(Lambda),并且支持回调,任务形式采用函数子对。

目录

双缓冲队列模板
线程类
线程池类
线程池性能测试
源码地址:
gitee: https://gitee.com/eterfree/ThreadPool
github: https://github.com/freedomandjustice/ThreadPool

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值