线程池前世今生及源码实现

文章目录

    • ⭐前序
    • 一、是什么(what)
      • @功能构成
    • 二、为什么(why)
    • 三、何处(where)
    • 四、何时(when)
    • 五、谁(who)
    • 六、怎么样(how)
      • @实践和性能调优策略
      • @线程池源码(Code)[待补充]

⭐前序

本文讲什么:

  • 线程池的概念、工作原理、优势、实际应用中的使用场景和注意事项,以及一些最佳实践和性能调优策略。

  • 线程池源码

一、是什么(what)

  • 线程池是一种用于管理和重用线程的机制。它包含了一组预先创建的线程,这些线程可以被重复使用来执行多个任务,而不需要频繁地创建和销毁线程,从而提高了程序的性能和资源利用率。

  • 是一个生产者、消费者模型,业务线程将任务抛给线程池,由线程池中的线程异步执行,可以增加业务线程的处理能力,提升并发量。

  • 可以是一个定时任务器,可以执行延时、超时任务。

  • 多线程编程中,使用线程池是一种常见的优化手段。

@功能构成

  • 线程池的核心组件,负责创建、管理和销毁线程池。它提供了对线程池的管理接口,如添加任务、关闭线程池等。

举例:

  1. 线程池的创建(ThreadPool Create:在应用程序启动时,创建一个线程池,包含多个线程,并初始化线程池的参数,如核心线程数、最大线程数、任务队列等。

  2. 任务提交(Task Commit):当有任务需要执行时,将任务提交给线程池而不是直接创建线程。任务可以是实现了Runnable接口或Callable接口的对象。

  3. 任务队列(Work Queue):线程池通常包含一个任务队列,用于存储待执行的任务。任务被提交到队列中,等待线程池的线程来执行。

  4. 线程执行任务(Tasks):线程池中的线程定期检查任务队列,获取任务并执行。如果线程池中有空闲线程,则任务立即被分配给空闲线程执行。

  5. 线程重用(Threads reuse):线程执行完一个任务后,并不立即销毁,而是继续等待执行下一个任务,以避免频繁创建和销毁线程的开销。

  6. 线程池参数配置(ThreadPool Parameters):线程池的参数可以配置,包括核心线程数、最大线程数、任务队列大小、线程空闲时间等,根据实际需求进行调整以优化性能。

  7. 任务拒绝策略(Task Rejection Policy):当任务队列已满且线程池无法接受新任务时,线程池会根据预先设定的任务拒绝策略来处理新提交的任务,如抛出异常、丢弃任务等。

  8. 线程池的关闭(ThreadPool Close):当应用程序关闭时,线程池也会关闭。它会等待当前正在执行的任务完成,然后关闭线程池中的所有线程。

二、为什么(why)

  • 可以提高多线程程序的性能和稳定性,减少资源的浪费

具体因素举例:

  1. 减少线程创建和销毁的开销:线程的创建和销毁是比较昂贵的操作,涉及到内存分配和资源初始化。如果在程序中频繁地创建和销毁线程,会消耗大量的系统资源,降低系统的性能。而线程池可以重用已经创建的线程,避免了这种开销。

  2. 控制并发线程数量:线程池可以限制同时执行的线程数量,防止系统因过多线程而过载。通过合理地设置线程池的参数,如核心线程数和最大线程数,可以根据系统的负载情况动态地调整线程的数量,保证系统的稳定性。

  3. 提高响应速度:线程池中的线程可以立即执行任务,无需等待线程创建,从而更快地响应任务请求。这对于需要快速处理任务的场景,如网络服务器、并行计算等,具有重要意义。

  4. 统一管理和监控:线程池可以集中管理和监控线程的状态和执行情况,方便调试和优化。可以通过线程池的管理接口,查看线程池的状态、活动线程数、任务队列长度等信息,及时发现并解决问题。

  5. 防止资源耗尽:线程池可以限制同时执行的线程数量,防止系统因过度并发而耗尽资源。通过合理地配置线程池的参数,可以避免系统因过多线程而导致内存、CPU等资源耗尽的情况。

三、何处(where)

  • 线程池适用于需要处理大量并发任务的各种应用场景,可以提高系统的性能、资源利用率和可维护性。

应用场景举例:

  1. Web 服务器 Web 服务器需要同时处理大量的客户端请求,包括处理 HTTP 请求、数据库查询、文件读写等操作。使用线程池可以有效地管理这些并发请求,避免为每个请求创建一个新线程而导致系统资源消耗过多。

  2. 后台任务处理 许多应用程序需要执行后台任务,例如定期数据备份、日志清理、邮件发送等。使用线程池可以确保这些后台任务能够在后台线程中异步执行,而不会阻塞主线程或影响用户体验。

  3. 并行计算 并行计算是一种利用多个处理单元同时执行计算任务的技术,常用于科学计算、数据分析等领域。线程池可以用于管理并发执行的计算任务,提高计算效率和性能。

  4. 异步 I/O 操作 许多 I/O 密集型应用(如网络服务器、文件处理程序等)需要进行异步 I/O 操作以避免阻塞线程。线程池可以用于管理异步 I/O 操作的执行,确保应用能够高效地处理大量的 I/O 请求。

  5. 定时任务调度 许多应用程序需要执行定时任务,例如定时数据统计、定时报表生成等。线程池可以用于执行这些定时任务,确保它们能够按照预定的时间间隔执行,并且不会相互干扰。

  6. 并发数据处理 在处理大量数据时,使用线程池可以加速数据处理过程。例如,对大型数据集进行排序、过滤、转换等操作时,可以将数据分成多个任务并发处理,以提高处理速度和效率。

  7. GUI 应用程序 在 GUI 应用程序中,需要确保用户界面的响应性。将耗时的操作(如文件读写、网络请求等)放在线程池中异步执行,可以避免阻塞主线程,确保用户界面的流畅性和响应性。

四、何时(when)

  • 此时在用的
  1. ZLMediaKit ZLMediaKit 在其架构中通过线程池来优化处理性能,主要在网络请求处理、媒体数据的编解码、以及流数据的传输等核心模块使用。线程池允许系统维持一组活跃的线程,这些线程可以被多个任务复用,从而减少了频繁创建和销毁线程的开销。这种方式不仅提高了服务器的响应速度,也增强了系统处理高并发请求的能力,是实现高效流媒体数据处理的关键组件之一。

  2. Redis Redis 是一个内存数据库和缓存服务器,被广泛用于缓存、消息队列、会话存储等场景。Redis 使用线程池来处理客户端的请求,并发执行各种操作,例如读取、写入、删除等。线程池的大小和配置可以通过 Redis 的配置文件进行调整,以适应不同的负载情况。

五、谁(who)

  • 开源线程池的库
  1. ZLToolKit ZLToolKit 是一个C++语言的网络库、线程库(含线程池)、工具库等,被应用于ZLMediaKit流媒体服务器。
  2. libevent Libevent 是一个C语言的开源的、跨平台的异步事件通知库,它允许应用程序在高性能的网络通信、定时事件处理、信号处理等方面执行异步操作。Libevent 主要设计用于构建网络服务器或其它需要高度并发处理的应用程序。

六、怎么样(how)

@实践和性能调优策略

  1. 合理设置线程池大小:根据系统的负载和硬件配置,合理设置线程池的大小,避免线程过多或过少导致性能下降。

  2. 使用合适的任务队列:选择合适的任务队列类型,如有界队列或无界队列,以满足不同的需求。

  3. 定期监控线程池性能:定期监控线程池的性能指标,如任务执行时间、任务等待时间、线程池使用率等,及时发现并解决性能瓶颈。

  4. 任务拒绝策略的选择:根据业务需求选择合适的任务拒绝策略,以保证系统的稳定性和可靠性。

  5. 避免死锁和饥饿:合理设计任务和资源的竞争关系,避免死锁和饥饿现象的发生。

@线程池源码(Code)[待补充]

主要实现是:
① 线程池的管理:创建、修改、销毁线程池
② 任务队列:能够将 函数/lambda 对象的入队、出队
③ 线程任务函数:线程实例从队列中取出任务并执行,空闲时阻塞
④ 任务定时器:需要优先队列的支持

注意点:线程安全、线程资源合理分配、内存安全/泄露、减少资源开销(CPU/内存、锁等)、异常捕获。。。

C/C++ code 待续。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/601246.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于2024年上半年软考考试批次安排的通告

按照《2024年计算机技术与软件专业技术资格(水平)考试工作安排及有关事项的通知》(计考办〔2024〕1号)文件精神,结合各地机位实际,现将2024年上半年计算机软件资格考试有关安排通告如下: 一、考…

【排序算法】之冒泡排序

一、算法介绍 冒泡排序(Bubble Sort)是一种基础的排序算法,它的主要思想是通过重复遍历待排序的列表,比较每对相邻的元素并根据需要交换它们,使得每一遍遍历都能将未排序的最大(或最小)元素“冒…

RH 414膜电位荧光探针,161433-30-3,具有出色的荧光性质和高度专业化的反应原理

一、试剂信息 名称:RH 414膜电位荧光探针CAS号:161433-30-3结构式: 二、试剂内容 RH 414膜电位荧光探针是一种基于荧光共振能量转移(FRET)技术的荧光染料,具有出色的荧光性质和高度专业化的反应原理。…

Cordova 12 Android 不支持 http 原因探索

最近在升级 Cordova 到最新版本,升级完成后发现无法请求网络,研究了两次最终发现解决方案。 发现控制台中有日志输出,提示当前是 https ,无法直接访问 http。 [INFO:CONSOLE(225)] "Mixed Content: The page at https://lo…

如何更好地使用Kafka? - 运行监控篇

要确保Kafka在使用过程中的稳定性,需要从kafka在业务中的使用周期进行依次保障。主要可以分为:事先预防(通过规范的使用、开发,预防问题产生)、运行时监控(保障集群稳定,出问题能及时发现&#…

tf2使用savemodel保存之后转化为onnx适合进行om模型部署

tf2使用savemodel保存之后转化为onnx适合进行om模型部署 tf保存为kears框架h5文件将h5转化为savemodel格式,方便部署查看模型架构将savemodel转化为onnx格式使用netrononnx模型细微处理代码转化为om以及推理代码,要么使用midstudio tf保存为kears框架h5文…

设计严谨,思路绝妙!这篇高级孟德尔随机化研究:药靶、共定位,发文一区(IF=8.9)!...

现在越来越多的学者在用孟德尔随机化高级方法发文,今天我们看的这篇这篇药靶孟德尔随机化,还用了共定位分析方法,亮点在于它的设计严谨,思路绝妙,一起看下去吧! 2024年4月21日,四川大学华西医院…

机器人码垛机的主体结构及技术特点

在现代物流和生产线上,机器人码垛机以其高效、准确的特点,成为了不可或缺的重要设备。那么,这个神奇的机器人究竟由哪些部分组成?它的内部结构又有哪些奥秘呢?接下来,就让我们一起揭开它的神秘面纱! 一、机器人码垛机的主体结构…

每日OJ题_贪心算法三②_力扣553. 最优除法

目录 力扣553. 最优除法 解析代码 力扣553. 最优除法 553. 最优除法 难度 中等 给定一正整数数组 nums,nums 中的相邻整数将进行浮点除法。例如, [2,3,4] -> 2 / 3 / 4 。 例如,nums [2,3,4],我们将求表达式的值 "…

【Leetcode每日一题】 穷举vs暴搜vs深搜vs回溯vs剪枝_全排列 - 子集(解法2)(难度⭐⭐)(72)

1. 题目解析 题目链接:78. 子集 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 为了生成一个给定数组 nums 的所有子集,我们可以利用一种称为回溯(backtracking)的算法…

美国纽扣电池UL4200A及16CFR1262标准亚马逊要求

2023年9月21日,美国消费品安全委员会CPSC(Consumer Product Safety Commission) 决定采用UL 4200A-2023(包含纽扣电池或硬币电池的产品安全标准)作为包含纽扣电池或硬币电池的消费品的强制性消费品安全规则,相关要求同时被编入到1…

C++中的异常处理方式

目录 一、异常 二、C语言中对错误的处理 三、C中的异常处理 四、异常的抛出和捕获 五、异常的重新抛出 六、C标准库中的异常体系 七、异常的规范 一、异常 在C中,异常是程序运行期间发生的意外或错误情况。这些情况可能会导致程序无法继续正常执行,…

STM32接入CH340芯片的初始化进入升级模式(死机)问题处理

目录 1. 问题描述2. 问题分析2.1 CH340G/K 的初始化波形2.2 第1种USB升级电路2.3 第2种USB升级电路2.4 第3种USB升级电路2.5 第4种USB升级电路 3. 总结 1. 问题描述 我所用的CH340G(CH340K也用过)接在MCU的电路中,在插入CH340G/K 的接插件&a…

基于点灯Blinker的ESP8266远程网络遥控LED

本文介绍基于ESP8266模块实现的远程点灯操作,手机侧APP选用的是点灯-Blinker,完整资料及软件见文末链接 一、ESP8266模块简介 ESP8266是智能家居等物联网场景下常用的数传模块,具有强大的功能,通过串口转WIFI的方式可实现远距离…

文献速递:深度学习医学影像心脏疾病检测与诊断--CT中的深度学习用于自动钙评分:使用多个心脏CT和胸部CT协议的验证

Title 题目 Deep Learning for Automatic Calcium Scoring in CT: Validation Using Multiple Cardiac CT and Chest CT Protocols CT中的深度学习用于自动钙评分:使用多个心脏CT和胸部CT协议的验证 Background 背景 Although several deep learning (DL) calc…

微软开发新模型;YouTube 推出新AI功能;可折叠iPhone 或发布?

微软或开发新模型与 Google、OpenAI 竞争 The Information 报道,微软正在训练一种新的 AI 大模型「MAI-1」,规模上足以与 Google、Anthropic 乃至 OpenAI 的先进模型抗衡。 据报道,这个 MAI-1 模型由微软聘请的 Inflection 前 CEO Mustafa S…

unity基础(二)

debug方法 Debug.Log(" 一般日志 ");Debug.LogWarning(" 警告日志 ");Debug.LogError(" 错误日志 ");// Player Informationstring strPlayerName "Peter";int iPlayerHpValue 32500;short shPlayerLevel 10;long lAdvantureExp 1…

爱普生MCU系列语音芯片S1C31D41

随着科技的发展和产品的集成化,语音芯片已经逐渐替代了多种语音设备应用在各场合。语音芯片主要特性是功耗低,抗干扰能力强,外围器件少,控制简单,语音保存时间久(某些语音芯片可以保存内容100年),掉电不丢失…

yolo-world:”目标检测届大模型“

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享,包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

【Git】Git学习-16:git merge,且解决合并冲突

学习视频链接: 【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 1 创建分支dev,并用merge合并master分支,使dev分支合并上master分支中内容为…
最新文章