【线程池项目(三)】线程池CACHED模式的实现

在上一篇【线程池项目(二)】线程池FIXED模式的实现 中我们了解到到线程池fixed模式的大致实现原理,但对于一个比较完整的项目来说,我们还需要考虑到可能会发生的各种情况,比如用户提交的任务数可能在某一时刻急剧增加,而且每个任务的任务量比较小,在这种情况下,仅仅是在fixed模式下,可能会造成有些任务永远得不到执行或者等待非常久的时间,使用户体验变差。然,要是我们能够通过改良使能够执行任务的线程动态的创建和删除,那么就能很好的解决这个问题,也就是下面我们要介绍的cached模式下的线程池

由于第二篇中已经将线程池的关键技术点做了详细的介绍,而cached模式也是在fixed模式的基础上扩展而来的,所以对于下面的代码剖析仅仅关注于cached模式下的扩展部分

如果需要与本篇博客完全匹配的实现代码,也可以在 我的gitee 上下载对应的源码

项目经历——基于C++新特性以及模板编程实现的线程池

    • 一、cached模式设计的实现🧐🧐🧐
    • 二、重点理解 ThreadPool::~ThreadPool()析构函数😮😮😮
    • 三、思考 :thinking::thinking::thinking:
    • 四、总结😩😩😩

一、cached模式设计的实现🧐🧐🧐

这里需要提一句,既然在cached模式下,我们涉及到线程的动态创建和删除,那么肯定也需要考虑到,当所有任务执行完后,对于空闲线程的资源回收问题,毕竟咱们的CPU资源有限。

🙉 ThreadPool:private
之前fixed模式下,我们使用的是线程列表vector(非线程安全),这里需要回收指定线程的话,需要将其换成unordered_map<int, std::unique_ptr<Thread>>,把每个线程对象都与一个线程ID对应起来方便管理,而线程ID的话是由Thread里的静态变量generateId_自己生成的,见下图二:
在这里插入图片描述
在这里插入图片描述


🙈 ThreadPool::start() / ThreadPool::submitTask():
为了使每个线程对象都能够对应一个线程ID,不管是在刚开启线程池创建初始线程数时,还是在任务过多需要动态创建线程时,都需要在使用绑定器时预留一个参数占位符,供线程创建使用、线程回收时删除:
在这里插入图片描述
在这里插入图片描述


二、重点理解 ThreadPool::~ThreadPool()析构函数😮😮😮

🙊 线程池的析构函数这里很关键,通过设置线程池的运行状态,通知等待线程继续往下执行,用条件变量阻塞等待其他线程,判断其是否都已经结束
在这里插入图片描述
建议联系下面给出的线程函数方法的完整代码和测试程序认真理解,分析各种抢锁的情况,以及可能出现的问题,或者直接看我的博客【手写线程池(四)】项目死锁问题的分析



🥹 ThreadPool::threadFunc():
对于线程回收机制,我们规定了两个条件

  • fixed模式下,任务队列为空,无限期阻塞,不回收
  • cached模式下,任务队列为空,每次等待1s,轮询至60s,若还是没有任务到来,则回收该线程

对于时间,我们使用C++11标准里边的

  • std::chrono::high_resolution_clock().now()来获取、
  • std::chrono::duration_cast<std::chrono::seconds>(now - lastTime).count()来记录时间差

下面来贴一段完整的实现线程函数的代码截图:
在这里插入图片描述
在这里插入图片描述

这里我再给一段测试程序代码截图
在这里插入图片描述

三、思考 🤔🤔🤔

我们知道线程不外乎就两种状态,

  • 一种是wait状态,等待任务的到来,
  • 另一种是exec()状态,正在执行任务,还未执行完

根据以上三段完整代码,我们是否可以提出几个问题???

  • 用于执行任务的线程处于wait状态,主线程执行线程池的析构函数,会发生什么
  • 用于执行任务的线程处于exec()状态,主线程执行线程池的析构函数,会发生什么

其实还有第三种状态!!!

  • 当主线程准备执行析构函数把isPoolRunning置为false前,正在执行任务的线程恰好执行完任务并且再一次通过while(isPoolRunning)进入循环,会发生什么

这三个问题将在下一篇进行剖析,感兴趣的朋友可以先试着分析一下

四、总结😩😩😩

以上就是有关于【线程池项目(三)】线程池CACHED模式的实现 的内容,下一篇【线程池项目(四)】项目死锁问题的分析 将带大家剖析两个经典的死锁问题🔚🔚🔚

🌻🌻🌻如果聪明的你浏览到这篇文章并觉得文章内容对你有帮助,请不吝动动手指,给博主一个小小的赞和收藏🌻🌻🌻

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

贪心算法---前端问题

1、贪心算法—只关注于当前阶段的局部最优解,希望通过一系列的局部最优解来推出全局最优----但是有的时候每个阶段的局部最优之和并不是全局最优 例如假设你需要找给客户 n 元钱的零钱&#xff0c;而你手上只有若干种面额的硬币&#xff0c;如 1 元、5 元、10 元、50 元和 100…

【数据结构】排序(1)

目录 一、概念&#xff1a; 二、直接插入排序&#xff1a; 三、希尔排序&#xff1a; 四、直接选择排序&#xff1a; 五、堆排序&#xff1a; 六、冒泡排序&#xff1a; 一、概念&#xff1a; 排序的概念&#xff1a; 使一串记录&#xff0c;按照其中的某个或某些关键字…

Canvas实现打砖块

一.预览 二.代码 <!DOCTYPE html> <html lang"en"> <head><title>打砖块</title><style>#myCanvas {background: #eee; /* 设置画布的背景颜色为浅灰色 */display: block;margin: 0 auto; /* 使画布在页面中居中显示 */}</s…

高原制氧机的工作原理以及对高原地区生活质量的积极影响

在广袤的高原地区&#xff0c;空气稀薄&#xff0c;氧气含量相对较低&#xff0c;给当地居民和外来游客带来了不小的困扰。然而&#xff0c;随着科技的飞速进步&#xff0c;高原制氧机应运而生&#xff0c;成为改善高原生活质量的重要利器。恒业通将探讨高原制氧机的工作原理、…

【算法与数据结构】463、LeetCode岛屿的周长

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;直接利用公式法&#xff0c;遇到一对相邻的陆地&#xff0c;总周长就减去2。那么周长公式为&#xff1…

微服务篇之任务调度

一、xxl-job的作用 1. 解决集群任务的重复执行问题。 2. cron表达式定义灵活。 3. 定时任务失败了&#xff0c;重试和统计。 4. 任务量大&#xff0c;分片执行。 二、xxl-job路由策略 1. FIRST&#xff08;第一个&#xff09;&#xff1a;固定选择第一个机器。 2. LAST&#x…

打包了一个QGIS3.34分享给大家

春节期间一时兴起编译打包了一个最新的QGIS版本QGIS3.34!秉承咱一贯理念&#xff0c;方便您使用也方便您不用&#xff01;该工具还是被打包为绿色版&#xff0c;即下即用&#xff0c;不用安装更无须卸载。微云的下载速度也比官方快很多&#xff0c;能大大节约您的时间提高您的工…

JavaAPI常用类02

目录 基本数据类型封装类 包装类常用属性方法 8中基本数据类型各自所对应的包装类 以下方法以java.lang.Integer为例 代码 运行 装箱和拆箱 装箱 何为装箱 代码 范围问题 代码 运行 拆箱 代码 String类 概述 代码 运行 创建形式 画图讲解 代码 运行 构造…

vscode使用restClient实现各种http请求

vscode使用restClient实现各种http请求 一&#xff0c;安装插件 首先&#xff0c;我们要在vscode的扩展中&#xff0c;搜索rest Client&#xff0c;然后安装它&#xff0c;这里我已经安装过了。 安装后&#xff0c;我们就可以使用rest client插件进行http各种操作了。 二&…

leetcode刷题-删除链表的倒数第N个节点(一次循环)

题目描述 解题思路 这几天玩的时间比较长&#xff0c;没有坚持更新。 解题思路很简单&#xff0c;也算是比较经典的问题。首先可以通道暴力解决&#xff0c;首先计算出来链表的长度&#xff0c;然后计算出来链表的长度&#xff0c;然后找到距离删除位置的前一个位置&#xff0…

131.乐理基础-快速识别音程(一)

上一个内容&#xff1a;130.乐理基础-倍增音程、倍减音程-CSDN博客 上一个内容里练习的答案&#xff1a; 开始不用数音数就可以辨别音程的方法&#xff0c;首先是不含升降号记号的两个音&#xff08;两个白键&#xff09;该怎样判断 方法的核心&#xff0c;就是音名中e-f和b-…

代码随想录算法训练营第28天 |第七章 回溯算法part04

学习目标&#xff1a; 93.复原IP地址 78.子集 90.子集II 学习内容&#xff1a; 93.复原IP地址 /class Solution { public:// string path;vector<string> result;bool isValid(const string& s, int start, int end) {if(start>end)return false;if(s[start]0&a…

SELF-RAG 论文详解

论文&#xff1a; https://arxiv.org/pdf/2310.11511.pdf code&#xff1a; https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_self_rag.ipynb?refblog.langchain.dev 相关工作 RAG 尽管 RAG 方法可以通过检索生成得到更为准确的结果&#xff0…

Codeforce Monsters Attack!(B题 前缀和)

题目描述&#xff1a; 思路&#xff1a; 本人第一次的想法是先杀血量低的第二次想法是先搞坐标近的第三次想法看到数据量这么大&#xff0c; 我先加个和看看貌似我先打谁都行&#xff0c;由此综合一下&#xff0c; 我们可以把每一个不同的坐标当作一轮从最小的坐标开始&#x…

老子云2024全站焕新,重塑3D轻量体验

3D模型当前应用广泛&#xff0c;正以惊人的速度实现数据增长&#xff0c;轻量化需求随之增多。老子云团队一直在探索如何借助自研轻量化技术的能力&#xff0c;打破用户模型处理思维惯性&#xff0c;构建更高效、实用、简单的体验范式&#xff0c;来帮助用户解决3D素材数据处理…

开源工具和框架

目录 开源工具和框架 一、 开源工具和框架 二、开源工具和框架在现代软件开发中的角色 1、基础设施建设&#xff1a; 2、开发效率提升&#xff1a; 3、代码质量保障&#xff1a; 4、技术创新&#xff1a; 三、广泛使用的开源项目分析 3.1、Linux 3.2、Git 3.3、Docke…

js设计模式:状态模式

作用: 将对象的行为和状态进行分离,状态是由行为操作决定的,而不是直接控制。 同时,行为也是由状态决定的,每个状态都有自己的行为和相应的方法 行为与状态分离,可以使代码方便维护 示例: <!DOCTYPE html> <html lang"en"><head><meta cha…

THE TRAVELING OBSERVER MODEL

FiLM (Perez et al., 2018) 作者未提供代码 参考文献 [1] E. Perez, F. Strub, H. de Vries, Vincent Dumoulin, and Aaron C. Courville. Film: Visual reasoning with a general conditioning layer. In Proc. of AAAI, 2018.

华为OD机试真题-万能字符单词拼写-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; str.repalce(old, new, 1); flag 代码&#xff1a; """ 题目分析&#xff1a; 没有掌握&#xff0c;输出为0 输入&#xff1a; words的个数&#xff0c; N int 每个字符串元素输出&#xff1a; 词汇表words中掌握的单…

软件实际应用实例,茶楼收银软件管理系统操作流程,茶室计时计费会员管理系统软件试用版教程

软件实际应用实例&#xff0c;茶楼收银软件管理系统操作流程&#xff0c;茶室计时计费会员管理系统软件试用版教程 一、前言 以下软件以 佳易王茶社计时计费管理系统软件V17.9为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、计时计费&…