C++中的三大池:线程池,内存池,数据库连接池

news2024/12/24 10:07:04

C++中有三大池,即我们常说的:线程池,内存池,数据库连接池。

一.线程池

多线程同时访问共享资源造成数据混乱的原因就是因为CPU的上下文切换导致,线程池就是为了解决此问题而生。
多线程常用的有:std::thread、Boost.Thread库,以及Qt提供线程池类QThread。
线程池的结构,手写线程池设计思路:
1.设计任务的结构体,及任务队列,存储需要处理的任务,后面由工作的线程来处理这些任务:
设计一个任务结构体struct或者class;
设计基于管理任务的队列queue的类,包含添加任务,删除任务,取出任务;
2.设计工作的线程(任务队列任务的消费者),N个:
线程池维护一定数量的工作现场,以不停的取出任务并处理
工作的线程充当任务的消费者角色
任务队列为空时,工作的线程将被阻塞
有了新任务时,生产者将解出阻塞,让工作线程开始工作;
3.管理者线程(不处理任务队列中的任务),1个:
管理者线程主要检测任务队列中的任务数量和处于繁忙状态的工作线程
任务多的时候适当创建新的工作线程,任务少的时候适当销毁一些工作线程
按照设定的工作线程量的最大最小个数来控制工作线程的个数。
线程池

二.内存池

1.内存池的作用:解决内存碎片问题,提高内存申请分配效率,防止内存泄漏和野指针;
2.使用:可以使用Boost库和Jemalloc库的内存池,也可以自己手写内存池;
3.设计原理:
预分配内存:先申请一大块内存,根据情况划分成多个小的内存块
初始化内存块链表:将整体内存里的所有内存块包括各自的地址和状态信息,放入一个链表来维护
实现内存分配函数:当采购员宣布内存请求时,分配函数从内存链表中找到一块可用的内存,返回内存块的地址;
实现内存释放函数:当用完内存块后,将内存块中的数据清空并将该块内存加入到内存链表中并将其状态改为可用;
实现内存整理函数:内存整理是将连续可用的内存块合并为一个大的内存块,或者将某个大的内存块分割成多个小的内存块,以提高使用效率

三.数据库连接池

连接池是一个单例模式的类
所有的连接任务都放到一个队列中,可以用STL的Queue
使用互斥锁来保护队列的线程安全
可以从连接池中得到一个或多个可用的数据库连接
如果队列中没有多余的可用连接,需要动态的创建新连接
如果队列中空闲的连接太多,需要动态的销毁一部分
数据库操作完毕,需要将连接归还到连接池中

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

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

相关文章

编译原理必考大题:子集法将NFA转换为DFA【详细讲解,真题实战】

写在最前,本文为实战向,解决问题的求法,理论基础见我的上一篇博客,当然了,只做题的话,看这个就够用了 文章目录 NFA转换为DFA如何求ε-闭包?如何求状态转换弧集?NFA转换为DFA的方法论真题实战例题一例题二…

认识100种电路之稳压电路

在电子电路中,稳压电路扮演着至关重要的角色。那么,为什么电路需要稳压?稳压的原理又是什么?以及稳压需要用到哪些元器件,数量又有多少呢?今天,就让我们一同揭开稳压电路的神秘面纱。 【电路为什…

版本控制系统:Git 纯应用(持续更新)

基本操作 ctrl上行键:上次代码 本地仓库:Git init 新建文件:touch xxxx.xxx 查看状态:Git status 文件从工作区——暂存区:Git add ./文件名(.是通配符代表所有) 暂存区——仓库:Git commit -m &…

【接口自动化测试】第三节.实现项目核心业务接口自动化

文章目录 前言一、实现登录接口对象封装和调用 1.0 登录接口的接口测试文档 1.1 接口对象层(封装) 1.2 测试脚本层(调用)二、课程新增接口对象封装和调用 2.0 课程新增接口的接口测试文档 2.1 接口对象层…

软考高项备考经验分享

高项备考经验分享 在备考被论文卡两次后,这次终于通过了高项,分不是很高,比较幸运,对这次考试做个总结与分享,希望对同学们有所帮助。 1、备考时间 首先备考时间上不建议拉的太长,每天坚持看书3~6个月时…

Ubuntu22.04 源码安装 PCL13+VTK-9.3+Qt6,踩坑记录

Ubuntu 22.04LTS;cmake-3.25.0;VTK-9.3;PCL-1.13;Qt6.6 PCL可以通过 apt 命令直接安装(sudo apt install libpcl-dev),apt 命令安装的 VTK 是简略版,没有对 Qt 支持的包,所以笔者使用源码安装 PCL 和 VTK。 1. 安装 VTK 1) 安装 ccmake 和 VTK 依赖项: sudo apt-g…

食品行业怎么用JSON群发短信

食品作为日常生活不可缺少的元素,市场需求是很稳定的,但是份额就那么多,商家都要来抢占的话,就需要运营推广各凭本事,市场运营中选择合适的推广方式,可以增加店铺销售额,很多实体店或商城都会建…

几个常见的FPGA问题之序列发生器、编码器、D触发器

几个常见的FPGA问题之序列发生器、编码器、D触发器 语言 :Verilg HDL 、VHDL EDA工具: Vivado 几个常见的FPGA问题之序列发生器、编码器、D触发器一、引言二、背景1、序列发生器(Sequence Generator)2、编码器(Encoder)3、D触发器(D Flip-Flop)二、问题及解决方案1. 序…

PKG打包sqlite3项目,如何添加node_sqlite3.node依赖

项目地址:https://github.com/helson-lin/pkg_sqlite 在ffandown项目内,由于项目使用了sqlite3,在跨平台打包的时候,除了本机外其他平台打包之后运行缺少node_sqlite3.node依赖。 为了解决问题,百度了很久&#xff0c…

后端之路第三站(Mybatis)——结合案例讲Mybatis怎么操作sql

先讲一下准备工作整体流程要做什么 我们要基于一个员工管理系统作为案例,进行员工信息的【增、删、改、查】 原理就是用Mybatis通过java语言来执行sql语句,来达到【增、删、改、查】 一、准备工作 1、引入数据库数据 首先我们把一个员工、部门表的数…

Transformers是SSMs:通过结构化状态空间对偶性的广义模型和高效算法(二)

文章目录 6、针对SSD模型的硬件高效算法6.1、对角块6.2、低秩块6.3、计算成本 7、Mamba-2 架构7.1、块设计7.2、序列变换的多头模式7.3、线性注意力驱动的SSD扩展8、系统优化对于SSMs8.1、张量并行8.2、序列并行性8.3、可变长度 9、实证验证9.1、合成任务:联想记忆9…

Springcloud-消息总线-Bus

1.消息总线在微服务中的应用 BUS- 消息总线-将消息变更发送给所有的服务节点。 在微服务架构的系统中,通常我们会使用消息代理来构建一个Topic,让所有 服务节点监听这个主题,当生产者向topic中发送变更时,这个主题产生的消息会被…

【产品经理】订单处理9-台账库存管理

在订单处理过程中,台账库存的具体设计怎么做? 在订单处理过程中,分配仓库成功后要扣除仓库库存并计算商品缺货情况,仓库库存就是台账库存。 1,台账库存是针对某个仓库的库存,且台账库存只计算此商品SKU的库…

随州职业技术学院2024年成人高等继续教育招生简章

随州职业技术学院,这所历史悠久、声誉卓著的学府,如今正以其独特的魅力与实力,向广大成人学习者敞开怀抱,宣布启动2024年成人高等继续教育的招生工作。 在这片知识的沃土上,学院以其严谨的教学态度,为无数…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-20填充与步幅

20填充与步幅 import torch from torch import nn# 此函数初始化卷积层权重,并对输入和输出提高和缩减相应的维数 def comp_conv2d(conv2d, X):# 这里的(1,1)表示批量大小和通道数都是1#将输入张量 X 的形状调整为 (1, 1, height,…

最佳学习率和Batch Size缩放中的激增现象

前言 《Surge Phenomenon in Optimal Learning Rate and Batch Size Scaling》原文地址GitHub项目地址Some-Paper-CN。本项目是译者在学习长时间序列预测、CV、NLP和机器学习过程中精读的一些论文,并对其进行了中文翻译。还有部分最佳示例教程。如果有帮助到大家&a…

llm学习-1(包含如何使用github的codespace):

本文学习参考:datawhalechina/llm-universe: 本项目是一个面向小白开发者的大模型应用开发教程,在线阅读地址:https://datawhalechina.github.io/llm-universe/ 一些可使用的大模型地址: Claude 使用地址 PaLM 官方地址 Gemini…

24年hvv前夕,微步也要收费了,情报共享会在今年结束么?

一个人走的很快,但一群人才能走的更远。吉祥同学学安全https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247483727&idx1&sndb05d8c1115a4539716eddd9fde4e5c9&scene21#wechat_redirect这个星球🔗里面已经沉淀了: 《Ja…

机械拆装-基于Unity-总体设计

前言 在工业设计和制造领域,零部件的拆装技术是一个重要的应用场景,比如我们在工程训练课程中经历的摩托车发动机拆装课程,是机械类学生的必修课程。虚拟拆装系统模拟和仿真了模型的拆装过程,虽然SolidWorks等机械设计软件能够解决…

apipost的安装和测试添加接口能否正常使用

1.进入官网,点击免费使用(我是windows 64位,选合适自己的配置) 2.开始安装 选仅为我安装——下一步 选择自己的安装目录——点安装 等待 运行——完成 3.apipost一些基本操作——实现添加内容 (1)新建接口…