当前位置: 首页 > news >正文

Linux基础|线程池Part.1|线程池的定义和运行逻辑

线程池的定义和运行逻辑

多线程的问题:
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间

那么一个很自然的想法就出现了,如果能有一种技术使得线程可以复用,即执行完一个任务,并不被销毁,而是可以继续去执行其他任务就好了。

就此,线程池技术应运而生。

线程池的运行逻辑如下:

  • 作为一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务
  • 线程池线程都是后台线程。
  • 每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。
  • 如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池会自动添加另一个辅助线程,以确保所有处理器都保持繁忙状态。这样可以更有效地利用系统资源,提高并发处理能力
  • 如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程,但线程的数目永远不会超过最大值。
  • 超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。

线程池的组成部分主要分为3个部分,这三部分配合工作得到一个完整的线程池:

  1. 任务队列,存储需要处理的任务,由工作的线程来处理这些任务
    • 通过线程池提供的API函数,将一个待处理的任务添加到任务队列,或者从任务队列中删除。
    • 已处理的任务会被从任务队列中删除
    • 线程池的使用者,也就是调用线程池函数往任务队列中添加任务的线程就是生产者线程
  2. 工作的线程(任务队列任务的消费者),N个
    • 线程池中维护了一定数量的工作线程, 他们的作用是是不停的读任务队列, 从里边取出任务并处理
    • 工作的线程相当于是任务队列的消费者角色
    • 如果任务队列为空,工作的线程将会被阻塞(使用条件变量/信号量阻塞
    • 如果阻塞之后有了新的任务,由生产者将阻塞接触,工作线程开始工作。
  3. 管理者线程(不处理任务队列中的任务),1个
    • 特的任务是周期性的对任务队列中的任务数量以及处于忙状态的工作线程个数进行检测。
      • 当任务过多的时候,可以适当的创建一些新的工作线程(消费者)
      • 当任务过少的时候,可以适当的销毁一些工作的线程。

http://www.lryc.cn/news/340249.html

相关文章:

  • 蓝队面试经验总结
  • MySQL命令分类与大纲
  • windows编译xlnt,获取Excel表里的数据
  • c#字段和属性的区别
  • 微软正式发布Copilot for Security
  • AI大模型日报#0416:李飞飞《2024年人工智能指数报告》、Sora加入Adobe、李彦宏聊百度大模型之路
  • OpenCV轻松入门(八)——图片卷积
  • 鸿蒙HarmonyOS开发规范-完善中
  • 神经网络压缩图像
  • Catagory(rt)
  • Games104 现代游戏引擎3
  • 【云计算】混合云分类
  • 探索分布式系统监控zabbix------------自动发现与自动注册
  • 权限管理Ranger详解
  • WPF Extended.Wpf.Toolkit 加载界面
  • 【切换网络连接后】VMware虚拟机网络配置【局域网通信】
  • 革新鞋服零售:数据驱动的智能商品管理 解锁库存优化与高效增长
  • word文件的创建时间和修改时间可以更改吗?答案是肯定的 文件属性修改的方法
  • redisson -- 延迟队列RDelayedQueue
  • Flex弹性盒子布局案例(认识弹性布局)
  • 【ros2】ros1和ros2可以同时在一台机器上运行吗
  • PMSM MATLAB
  • 笔记本电脑上的聊天机器人: 在英特尔 Meteor Lake 上运行 Phi-2
  • 【Web】陇原战“疫“2021网络安全大赛 题解
  • 010Node.js自定义模块通过exports的使用,两种暴露的方法及区别(二)
  • 【CVE-2010-2883】进行钓鱼攻击的研究
  • 【Python】如何在Ubuntu上设置Python脚本开机自启
  • 计算机视觉——OpenCV Python基于颜色识别的目标检测
  • 2024中国内燃机展-北京汽车发动机零部件展
  • 【iOS】——SDWebImage源码学习