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 完整源码templatetypenameTclassResourcePool{public:usingPtr=shared_ptrResourcePool;ResourcePool(size_t capacity=8):_capacity(capacity){}// 获取一个对象shared_ptrTobtain(){lock_guardmutexlock(_mtx);if_pool.empty()){// 池空,创建新对象autoobj=make_sharedT();returnshared_ptrT(obj.get(),[this,obj](T*){recycle(obj);});}// 从池中取出autoobj=_pool.back();_pool.pop_back();// 返回带自定义删除器的 shared_ptr// 析构时自动回收到池中returnshared_ptrT(obj.get(),[this,obj](T*){recycle(obj);});}// 手动回收voidrecycle(constshared_ptrTobj){lock_guardmutexlock(_mtx);if(_pool.size()=_capacity){// 池满,丢弃return;}_pool.push_back(obj);}// 获取池大小size_tsize()const{lock_guardmutexlock(_mtx);return_pool.size();}private:vectorshared_ptrT_pool;size_t _capacity;mutablemutex _mtx;};1.3 自动回收机制关键在shared_ptr的自定义删除器:returnshared_ptrT(obj.get(),[this,obj](T*){recycle(obj);// 析构时自动回池});当shared_ptr引用计数归零时,不调用delete,而是调用recycle()将对象放回池中。1.4 使用示例// 创建 Buffer 资源池ResourcePoolBufferRawbuffer_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 类层次RingBufferT ├─ RingStorageT — 数据存储(listT) ├─ RingDelegate