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

ZLToolKit 源码分析(十):工具集 ResourcePool / RingBuffer / miniINI / TimeTicker

ZLToolKit 的 Util 模块包含大量精巧的工具类,本文选取 4 个高频使用组件:ResourcePool(资源池)、RingBuffer(环形缓冲区)、miniINI(INI 解析器)、TimeTicker(计时器),深入源码分析其设计。

1. ResourcePool — 资源池

1.1 设计动机

高并发场景下频繁创建/销毁对象(如 Buffer、RtpPacket)开销巨大。ResourcePool 通过循环复用已分配对象避免此问题。

传统方式: new Object() → 使用 → delete → new Object() → 使用 → delete ... 每次都有内存分配/释放开销 资源池: pool.obtain() → 使用 → pool.recycle() → pool.obtain() → 使用 → ... 对象循环复用,零分配

1.2 完整源码

template<typenameT>classResourcePool{public:usingPtr=shared_ptr<ResourcePool>;ResourcePool(size_t capacity=8):_capacity(capacity){}// 获取一个对象shared_ptr<T>obtain(){lock_guard<mutex>lock(_mtx);if_pool.empty()){// 池空,创建新对象autoobj=make_shared<T>();returnshared_ptr<T>(obj.get(),[this,obj](T*){recycle(obj);});}// 从池中取出autoobj=_pool.back();_pool.pop_back();// 返回带自定义删除器的 shared_ptr// 析构时自动回收到池中returnshared_ptr<T>(obj.get(),[this,obj](T*){recycle(obj);});}// 手动回收voidrecycle(constshared_ptr<T>&obj){lock_guard<mutex>lock(_mtx);if(_pool.size()>=_capacity){// 池满,丢弃return;}_pool.push_back(obj);}// 获取池大小size_tsize()const{lock_guard<mutex>lock(_mtx);return_pool.size();}private:vector<shared_ptr<T>>_pool;size_t _capacity;mutablemutex _mtx;};

1.3 自动回收机制

关键在shared_ptr的自定义删除器:

returnshared_ptr<T>(obj.get(),[this,obj](T*){recycle(obj);// 析构时自动回池});

shared_ptr引用计数归零时,不调用delete,而是调用recycle()将对象放回池中。

1.4 使用示例

// 创建 Buffer 资源池ResourcePool<BufferRaw>buffer_pool(64);// 获取 Bufferautobuf=buffer_pool.obtain();buf->setSize(0);// 重置// 使用 buf...recv(fd,buf->data(),buf->capacity(),0);// buf 离开作用域,自动回收到池中

1.5 线程安全

所有操作都通过_mtx保护,多线程安全。

2. RingBuffer — 环形缓冲区

2.1 设计动机

流媒体场景需要一写多读的数据结构:一个推流端写入,多个拉流端读取。RingBuffer 基于环形存储 + 分发器模式实现此需求。

2.2 类层次

RingBuffer<T> ├─ RingStorage<T> — 数据存储(list<T>) ├─ RingDelegate<
http://www.jsqmd.com/news/976623/

相关文章:

  • Docker化部署NFS服务器:一条命令替代Ubuntu原生安装,快速搭建测试环境
  • 网盘效率革命:八大平台直链解析工具的终极指南
  • 浙江EVA工具包生产厂家好评榜:2026年升级 - 品牌推广大师
  • 从‘匹配失败’到‘精准捕获’:re.findall()匹配空列表的5个排查技巧与进阶用法
  • 滁州CMA甲醛检测治理公司深度测评:正信CMA检测稳居榜首 - aZJ-111
  • 私有化视频会议系统/企业级融媒体平台EasyDSS全场景一体化协同赋能企业高效数字化办公
  • 终极指南:3分钟在Mac上制作Windows启动盘(WinDiskWriter完全攻略)
  • PHP分布式锁与应用场景
  • 任天堂Switch大气层系统终极指南:5个步骤快速上手自定义固件
  • FPGA入门避坑指南:从选型到烧录,我的第一个‘点灯’项目踩了哪些雷?
  • MCU深度学习:从GPIO到通信协议,系统化掌握单片机核心原理与项目实战
  • 2023电赛E题STM32F1嵌入式工程:CAN通信+伺服控制+完整驱动与算法实现
  • 2026石家庄名表回收指南:行情、避坑与四家机构实测 - 奢侈品回收测评
  • 别再死记硬背了!用这5个真实项目案例,帮你彻底搞懂软件工程导论的核心概念
  • 智能会议管理系统/视频直播点播EasyDSS打造一体化应急调度解决方案
  • HC08微控制器SCI串口通信:输入时钟与波特率配置详解
  • Blender超级导入导出插件:用复制粘贴彻底改变你的3D工作流 [特殊字符]
  • PN7160 NFC控制器硬件集成与软件移植实战指南
  • PN5190 NFC评估板从零上手:硬件配置、软件调试与射频优化全攻略
  • 供应链管理核心:从OTDC到OTDD,构建高韧性交付体系
  • 绝区零自动化助手:从日常任务到高阶挑战的完整解决方案
  • 告别XY平面局限:用CloudCompare的‘最佳拟合平面’Delaunay功能,搞定倾斜地形的三维建模
  • PMCE框架:小样本学习中的多粒度语义融合与双向特征增强
  • GNSS软件接收机调试指南:如何用MATLAB的plotTracking.m可视化分析跟踪环路性能
  • 无线通信基石:从CDMA到5G,硬判决Viterbi译码为何仍是经典?
  • 南京大学LaTeX论文模板终极指南:快速完成高质量毕业论文排版
  • PyTorch 0.4老版本兼容指南:手把手修复MNIST训练中的Variable弃用等坑(附完整可运行代码)
  • 别再到处找教程了!一份保姆级的SimpleFOC、ODrive、VESC学习路线图(附资源下载)
  • 东莞闲置浪琴、百年灵急变现,行业第一 “禹竞名奢汇” 同城快速上门 - 名奢变现站
  • STM32F4网线热插拔修复记:从同事的遗留Bug到CubeMX 6.3.0 + LWIP的完整解决方案