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

shared_ptr 快照用于安全地并发读取,无需拷贝

需求:A线程会修改T类型的变量x,B线程要读取x,由于x很大,B读取和操作的时候需要加锁,这样会占用很长的x的时间。

解决办法:

方法1:

B线程先加锁拷贝x到x_copy,然后锁可以释放,后面操作x_copy。但是拷贝也是很耗时的;

std::mutex mtx; T x; // 假设T是需要保护的大对象 // B线程读取逻辑 T x_copy; { std::lock_guard<std::mutex> lock(mtx); x_copy = x; // 拷贝x到x_copy } // 后续操作x_copy(无需加锁)

方法2:

不要维护x,维护std::shared_ptr<const T> x_ptr。然后B线程加锁复制 x_ptr_copy = x_ptr (只是创建了shared_ptr新增计数,没有发生拷贝),然后锁可以释放,B线程后续读取x_ptr_copy时读的是旧内容,即使此时x_ptr被A线程改变了,也不影响B的旧内容。

std::mutex mtx; std::shared_ptr<const T> x_ptr = std::make_shared<T>(); // A线程修改逻辑 { std::lock_guard<std::mutex> lock(mtx); auto new_ptr = std::make_shared<T>(*x_ptr); // 深拷贝 // 修改new_ptr指向的对象... x_ptr = std::move(new_ptr); // 原子替换 } // B线程读取逻辑 std::shared_ptr<const T> x_ptr_copy; { std::lock_guard<std::mutex> lock(mtx); x_ptr_copy = x_ptr; // 仅增加引用计数 } // 后续操作x_ptr_copy(无需加锁)

注意,这里用std::shared_ptr<const T>里的const非常重要,它保证了x_ptr的对象内容不会改变。想修改x_ptr只能整体替换指针指向对象,而不能改变当前指向对象的具体内容。

http://www.cnnetsun.cn/news/87172.html

相关文章:

  • 官方适配完的命令行ruby在鸿蒙PC上的使用方法
  • LobeChat能否接收语音指令?全双工对话体验
  • LangFlow快速入门:可视化构建AI应用
  • Langflow本地部署:隔离环境安装指南
  • 云端算力的进化:云服务器架构演进的三重范式变革
  • 解决facefusion报错No source face detected
  • PaddleOCR中英文文字识别实战与优化指南
  • LobeChat剪贴板交互优化:复制粘贴操作更加流畅自然
  • YOLOv5详解:高效目标检测模型实战指南
  • Windows下PaddleOCR GPU版环境搭建指南
  • “开盒神器”威胁下的自保手册:七招应对超级 Agent 的实时入侵
  • EBS后台查询人员职责信息
  • Qwen3-8B-AWQ性能优化与最佳实践
  • LLaMA-Factory 微调 DeepSeek-R1 模型实战指南
  • Langflow自定义组件开发与界面集成详解
  • LobeChat能否协助撰写简历?求职者福音来了
  • 使用Miniconda创建Python 3.8环境的完整步骤
  • 搭建Ollama并运行qwen,简单RAG实现
  • LobeChat能否显示用量统计?透明化消费展示
  • 解决langchain-chatchat缺少__init__.py问题
  • Linly-Talker:能对答如流的AI数字人
  • YOLOv5网络结构解析与代码实现
  • 使用线性回归算法预测房价
  • gpt-oss-20b微调与扩展全指南
  • 「ECG信号处理——(29)基于分层分类的ECG心律失常检测系统设计与实现」2025年12月16日
  • FaceFusion报错:未检测到源人脸
  • Tigshop 开源商城系统 【商品预售功能】上新!全款+定金双模式深度适配全行业经营需求
  • YOLOv8官方文档中文解读:新手必读
  • 基于深度学习的植物病害检测系统(UI界面+YOLOv8/v7/v6/v5代码+训练数据集)
  • Stable Diffusion 3.5本地部署指南与一键整合包