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

用智能指针实现的、线程安全的、可复用的 内存池

一、模板版头文件:monopoly_allocator.hpp

#ifndefMONOPOLY_ALLOCATOR_HPP#defineMONOPOLY_ALLOCATOR_HPP#include<mutex>#include<condition_variable>#include<vector>#include<memory>#include<algorithm>template<typenameT>classMonopolyAllocator{public:classData;usingDataPtr=std::shared_ptr<Data>;classData{public:Data(MonopolyAllocator*mgr):manager_(mgr){}std::shared_ptr<T>&data(){returndata_;}voidrelease();boolavailable_=true;std::shared_ptr<T>data_;private:MonopolyAllocator*manager_;};MonopolyAllocator(intsize){capacity_=size;available_=size;pool_.resize(size);for(inti=0;i<size;++i){pool_[i]=std::make_shared<Data>(this);}}DataPtrquery(inttimeout_ms=5000){std::unique_lock<std::mutex>lock(mtx_);boolhas_item=cv_.wait_for(lock,std::chrono::milliseconds(timeout_ms),[this](){returnavailable_>0;});if(!has_item)returnnullptr;autoit=std::find_if(pool_.begin(),pool_.end(),[](DataPtr&d){returnd->available_;});if(it==pool_.end())returnnullptr;(*it)->available_=false;available_--;return*it;}private:voidrelease(Data*d){std::lock_guard<std::mutex>lock(mtx_);if(!d->available_){d->available_=true;available_++;cv_.notify_one();}}std::vector<DataPtr>pool_;std::mutex mtx_;std::condition_variable cv_;intcapacity_;intavailable_;};template<typenameT>inlinevoidMonopolyAllocator<T>::Data::release(){manager_->release(this);}#endif

二、main.cpp(模板使用演示,支持任意类型)

#include<iostream>#include<memory>#include"monopoly_allocator.hpp"usingnamespacestd;intmain(){// ==============================================// 模板版:可以放 float / int / 结构体 / Tensor 等// ==============================================shared_ptr<MonopolyAllocator<float>>tensor_allocator_=make_shared<MonopolyAllocator<float>>(2);// ==============================================// 1. 获取一块数据// ==============================================autoitem1=tensor_allocator_->query();if(item1){cout<<"获取 item1 成功"<<endl;// 分配内存if(!item1->data()){item1->data()=make_shared<float>(640*640*3);cout<<"分配内存成功"<<endl;}float*ptr=item1->data().get();ptr[0]=1.0f;ptr[1]=2.0f;cout<<"赋值:ptr[0] = "<<ptr[0]<<", ptr[1] = "<<ptr[1]<<endl;}// ==============================================// 2. 获取第二个// ==============================================autoitem2=tensor_allocator_->query();if(item2){cout<<"获取 item2 成功"<<endl;}// ==============================================// 3. 释放 → 复用// ==============================================item1->release();cout<<"释放 item1 成功"<<endl;autoitem3=tensor_allocator_->query();if(item3){cout<<"获取 item3 成功(复用)"<<endl;}// 释放所有item2->release();item3->release();cout<<"程序运行完成!"<<endl;return0;}

三、超强亮点:现在支持任意类型了!

例子1:管理 float

shared_ptr<MonopolyAllocator<float>>alloc;

例子2:管理 int

shared_ptr<MonopolyAllocator<int>>alloc;

例子3:管理自定义结构体

structMyData{floatx,y,z;};shared_ptr<MonopolyAllocator<MyData>>alloc;

例子4:管理你的 TRT::Tensor(和你工程一模一样!)

shared_ptr<MonopolyAllocator<TRT::Tensor>>tensor_allocator_;tensor_allocator_=make_shared<MonopolyAllocator<TRT::Tensor>>(max_batch_size*2);

四、总结(超级清晰)

  1. 从固定 float 类型 → 通用模板类,支持任意数据类型
  2. 逻辑完全不变,性能不变,线程安全不变
  3. 智能指针管理分配器 + 管理数据 + 管理内存
  4. 可直接用于你的 YOLO/TensorRT 工程
  5. 写法和你项目里的TRT::Tensor分配器完全一致

http://www.jsqmd.com/news/671193/

相关文章:

  • Windows电脑上直接运行安卓应用?APK安装器终极解决方案
  • 解密QQ音乐加密音频:qmc-decoder工具完全指南
  • EF Core 10向量搜索插件安装失败?92%开发者忽略的3个.NET SDK版本陷阱(.NET 8.0.400+强制要求,旧版将静默降级为L2距离)
  • 【Dify 2026文档解析权威白皮书】:首次公开3大底层解析引擎重构逻辑与实测性能跃升47%的工程细节
  • fre:ac音频转换器终极指南:免费、高效、跨平台的音频处理解决方案
  • Kotlin 协程 - 在Android中的使用
  • 浏览器Cookie本地导出终极指南:Get cookies.txt LOCALLY完全解析
  • 当缠论遇上自动化:我如何用开源插件让技术分析变得更直观
  • RunFilesBuilder 项目安装与配置指南
  • 题解:洛谷 AT_abc355_c [ABC355C] Bingo 2
  • Dify工作流引擎演进史(2024→2026核心跃迁图谱):从YAML硬编码到可视化DSL+动态条件路由的工程化革命
  • 多页pdf怎么拆分成单页?5种高效方法,新手不用求人
  • 手把手教你用STM32CubeMX和FreeModbus搭一个完整的Modbus RTU主从测试环境
  • 题解:AcWing 278 数字组合
  • 创新实训(二)——FastAPI后端登录注册功能实现及前后端连接
  • 3 shell脚本编程
  • C语言数组实战:避开‘暴力模拟’的坑,用标记法高效统计‘安全区域’
  • 5分钟掌握Inter字体:现代网页排版的终极OpenType特性指南
  • 齿轮箱零部件及其装配质检中的TVA技术突破(9)
  • XXMI Launcher终极指南:一站式游戏模组管理器快速上手
  • 题解:AcWing 6 多重背包问题III
  • 突破Vitest浏览器测试并行执行瓶颈:从阻塞到飞一般的体验
  • ITK-SNAP医学图像分割:3步掌握专业级医学影像分析
  • 3大秘诀解锁Salt Player歌词黑科技:从零基础到车载高手全攻略
  • 终极指南:WarcraftHelper让魔兽争霸3在现代Windows系统焕发新生
  • 深度解析:Elasticsearch 的 REST API 有什么优点?
  • docker containerd 3 - 小镇
  • 题解:洛谷 AT_abc356_a [ABC356A] Subsegment Reverse
  • 别再傻傻分不清:5分钟搞懂通信里的误比特率、误码率、误帧率和误块率(BLER)
  • 从LocalDateTime序列化报错到搞定:一个Jackson配置拯救你的Spring Boot日期接口