news 2026/6/22 22:31:43

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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只能整体替换指针指向对象,而不能改变当前指向对象的具体内容。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 3:58:33

官方适配完的命令行ruby在鸿蒙PC上的使用方法

ohos-ruby 是为 OpenHarmony 平台编译的 Ruby 编程语言解释器。本文档详细介绍如何在鸿蒙PC上安装和使用官方适配完成的 Ruby 工具&#xff0c;包括 HNP 包的打包、安装、gem 包管理以及 Ruby 脚本的运行方法。 &#x1f4cb; 目录 一、项目概述二、为什么需要 HNP 包三、HNP …

作者头像 李华
网站建设 2026/6/22 14:32:44

LobeChat能否接收语音指令?全双工对话体验

LobeChat能否接收语音指令&#xff1f;全双工对话体验 在车载语音助手说出半句话就被打断、智能家居听不清命令反复确认的今天&#xff0c;我们对“真正自然”的人机对话期待已久。理想中的AI助手应该像真人一样——你能随时插话&#xff0c;它也能边说边听&#xff0c;而不是等…

作者头像 李华
网站建设 2026/6/23 14:19:15

LangFlow快速入门:可视化构建AI应用

LangFlow快速入门&#xff1a;可视化构建AI应用 在生成式AI浪潮中&#xff0c;开发者常常面临一个现实困境&#xff1a;想法很清晰&#xff0c;落地却耗时漫长。即便使用了LangChain这样的强大框架&#xff0c;编写和调试多模块协同的LLM流程依然需要大量编码工作。有没有一种…

作者头像 李华
网站建设 2026/6/23 15:07:35

Langflow本地部署:隔离环境安装指南

Langflow本地部署&#xff1a;隔离环境安装指南 在快速迭代的 AI 应用开发中&#xff0c;如何高效验证一个 LLM 工作流的想法&#xff1f;写一堆胶水代码&#xff1f;反复调试导入错误&#xff1f;还是手动管理几十个依赖版本&#xff1f; 其实&#xff0c;你完全可以用拖拽的…

作者头像 李华
网站建设 2026/6/22 20:26:27

云端算力的进化:云服务器架构演进的三重范式变革

在数字化转型的浪潮中&#xff0c;云服务器作为云计算的核心基础设施&#xff0c;正经历着从被动响应到智能协同的跨越式进化。从传统虚拟化到云原生架构&#xff0c;这场静默的技术革命重构了算力释放方式&#xff0c;推动行业向更高效、更智能的方向迈进。云服务器的架构演进…

作者头像 李华
网站建设 2026/6/23 16:50:31

解决facefusion报错No source face detected

解决 FaceFusion 报错&#xff1a;No source face detected 在使用 FaceFusion 进行人脸替换时&#xff0c;你是否曾满怀期待地运行命令&#xff0c;结果却只等来一句冰冷的提示&#xff1a; No source face detected程序戛然而止&#xff0c;换脸流程中断。这并非模型崩溃或内…

作者头像 李华