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

文章目录

    • ⭐前序
    • 一、是什么(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.mzph.cn/diannao/7942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware虚拟机提示内存不足

VMware虚拟机,k8s集群搭建内存不足的问题 疑问:我的电脑是8G8G双通道的内存,当我在搭建k8s集群时给master-2G内存,node1-3G内存,node2-3G内存; 当依次打开虚拟机到node2时VM提示“物理内存不足,…

【win32_004】系统配置信息、HIWORD宏、打印系统配置信息

文章目录 1. 获取系统度量或系统配置信息2. 格式化文本输出到图形输出3. HIWORD宏 1. 获取系统度量或系统配置信息 函数介绍 int WINAPI GetSystemMetrics(_In_ int nIndex);2. 格式化文本输出到图形输出 #mermaid-svg-RJl99A670ndu7R9k {font-family:"trebuchet ms&quo…

【busybox记录】【shell指令】cut

目录 内容来源: 【GUN】【cut】指令介绍 【busybox】【cut】指令介绍 【linux】【cut】指令介绍 使用示例: 关于参数的特殊说明: 打印行中选定部分 - 输出每行的第n-m个字节 打印行中选定部分 - 输出每行的第n-m个字符 打印行中选定…

【论文阅读】Fuzz4All: Universal Fuzzing with Large Language Models

文章目录 摘要一、介绍二、Fuzz4All的方法2.1、自动提示2.1.1、自动提示算法2.1.2、自动提示的例子2.1.3、与现有自动提示技术的比较 2.2、fuzzing循环2.2.1、模糊循环算法2.2.2、Oracle 三、实验设计3.1、实现3.2、被测系统和baseline3.3、实验设置以及评估指标 四、结果分析4…

每日OJ题_贪心算法三③_力扣45. 跳跃游戏 II(dp解法+贪心解法)

目录 力扣45. 跳跃游戏 II 解析代码1_动态规划 解析代码2_贪心 力扣45. 跳跃游戏 II 45. 跳跃游戏 II 难度 中等 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 num…

Windows在命令行控制台 CMD DOS PowerShell 创建文件夹 md mkdir New-Item

Windows在命令行控制台 CMD DOS PowerShell 创建文件夹 DOS可用mkdir命令创建文件夹CMD可用md命令创建文件夹PowerShell可用New-Item命令创建文件夹 测试代码 ### 在PowerShell中用井号 # 来单行注释, <#多行注释#> 不能用cmd中的 :: , rem空格 # PowerShell兼容 Dos…

ws注入js逆向调用函数

这里需要选择一个文件夹 随便 紫色为修改保存 记得ctrls保存 注入代码如下 (function() {var ws new WebSocket("ws://127.0.0.1:8080")ws.onmessage function(evt) {console.log("收到消息&#xff1a;" evt.data);if (evt.data "exit") {…

[3D基础]Delaunay与Triangulate构网

Delaunay三角剖分&#xff08;Delaunay Triangulation&#xff09;和Triangulate构网是两种常用于生成三角网格的方法&#xff0c;它们都有其独特的特点和应用场景。 Delaunay三角剖分&#xff1a; Delaunay三角剖分是一种经典的三角剖分方法&#xff0c;其特点是任意三角形的外…

PHPStudy Apache或者MySQL启动以后自动停止

问题 phpstudy小皮面板中的Apache或MySQL启动以后自动停止 正在启动——已启动——已停止 总结&#xff1a;最主要的原因&#xff1a;端口冲突 端口冲突了&#xff0c;已经有其他程序占用了80、3306端口。 也就是说你的电脑上已经有了一个Apache、MySQL并且正在运行。 解决方案…

C++ list 介绍

&#x1f308;一、认识list这个模版 ist是一个模版&#xff0c;需要结合一个具体的数据类型作为模版参数&#xff0c; 即list < T > <T> <T>&#xff0c;才能成为一个类类型。list是双向循环链表&#xff0c;是序列容器&#xff0c;允许在序列中的任何位置进…

前端技术Stylus详解与引入

Stylus 是一种动态样式语言&#xff0c;它允许使用更少的代码来生成 CSS。它是一个预处理器&#xff0c;这意味着你需要在浏览器加载前将 Stylus 代码转换成 CSS。Stylus 提供了多种功能&#xff0c;如变量、混合&#xff08;mixins&#xff09;、函数、继承等&#xff0c;这些…

DNS域名解析服务的部署及优化方案

实验要求: 1.配置2台服务器要求如下&#xff1a; a&#xff09;服务器1&#xff1a; 主机名&#xff1a;dns-master.timinglee.org ip地址&#xff1a; 172.25.254.100 配置好软件仓库 b&#xff09;服务器2&#xff1a; 主机名&#xff1a;dns-slave.timinglee.org ip地址&am…

MySQL数据库练习——视图

schooldb库——utf8字符集——utf8_general_ci排序规则 先创建库&#xff0c;再去使用下列的DDL语句。 DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL COMMENT 创建时间,modifyDate datetime DEFAULT NULL …

使用 GPT-4-turbo+Streamlit+wiki+calculator构建Math Agents应用【Step by Step】

&#x1f496; Brief&#xff1a;大家好&#xff0c;我是Zeeland。Tags: 大模型创业、LangChain Top Contributor、算法工程师、Promptulate founder、Python开发者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 个人说明书&#xff1a;Zeeland&…

音频数据集大全(1)-语音识别篇

1、Llama3 中文化数据集 简介&#xff1a;Llama3 中文化数据集是为了提高Llama3模型在中文语境下的表现而专门设计和准备的数据集。数据集被处理成firefly格式&#xff0c;这意味着它们可以直接用于firefly框架的训练过程。数据集包含了清洗处理后的合并文件&#xff0c;如sft_…

机器人系统ros2-开发实践07-将机器人的状态广播到 tf2(Python)

上个教程将静态坐标系广播到 tf2&#xff0c;基于这个基础原理这个教程将演示机器人的点位状态发布到tf2 1. 写入广播节点 我们首先创建源文件。转到learning_tf2_py我们在上一教程中创建的包。在src/learning_tf2_py/learning_tf2_py目录中输入以下命令来下载示例广播示例代码…

双ISP住宅IP有何优势?

双ISP住宅IP在当前的互联网环境中具有显著的优势&#xff0c;这些优势主要体现在网络连接的稳定性、安全性、速度以及业务适用范围等方面。以下是对双ISP住宅IP优势的详细分析&#xff1a; 第一点网络连接的稳定性&#xff0c;双ISP住宅IP使用两个不同的互联网服务提供商&…

CompletableFuture使用案例

优化代码时&#xff0c;除了Async注解&#xff0c;项目中如何使用多线程异步调用&#xff1f; 举个例子&#xff0c;去餐厅吃饭的时候。先点餐&#xff0c;厨师做菜&#xff0c;在厨师做菜的时候打游戏&#xff0c;然后根据厨师做的菜的口味去买矿泉水还是可乐。这样&#xff0…

区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(三)

&#x1f436;原文&#xff1a; Preventing Content Cloning in NFT Collections &#x1f436;写在前面&#xff1a; 这是一篇 2023 年的 CCF-C 类&#xff0c;本博客只记录其中提出的方法。 F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT​ and Blockchains with Native S…

SpringBoot2 仿B站高性能前端+后端项目(wanjie)

SpringBoot2 仿B站高性能前端后端项目(完结) Spring Boot 2 仿B站高性能前端后端项目&#xff1a;打造高效、稳定、可扩展的应用 在当今的互联网时期&#xff0c;网站的性能、稳定性和可扩展性成为了权衡一个项目胜利与否的关键要素。本文将引见如何运用 Spring Boot 2 构建一…