”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > std::shared_ptr 真的是线程安全的吗?对指向的对象的并发修改又如何呢?

std::shared_ptr 真的是线程安全的吗?对指向的对象的并发修改又如何呢?

发布于2025-01-07
浏览:635

Is std::shared_ptr truly thread-safe, and what about concurrent modifications to the pointed object?

std::shared_ptr 的线程安全

您从 MSDN 引用的有关 std::shared_ptr 线程安全的声明可能会被误解。这意味着虽然多个线程可以同时读写不同的shared_ptr对象,但这并不能保证修改shared_ptr对象本身的安全性。

TL;DR:

std::shared_ptr 的线程安全仅适用于指向同一底层对象的多个指针的管理。它不会扩展到共享对象的内容或对shared_ptr实例的并发写入。

详细说明:

shared_ptr内部由两个组件组成:

  • 控制块:管理shared_ptr的引用计数并确保正确销毁所指向的对象。该组件是线程安全的。
  • Pointed Object:被共享的实际数据结构或对象。该对象的线程安全性取决于其实现。

示例:

在您的代码片段中,global 是指向配置对象的共享指针。线程 1 将 global 复制到它自己的共享指针 private 中。如果线程 2 随后修改 global,private 仍将指向原始配置对象,因为控制块未修改。然而,如果线程2将新的配置对象分配给全局,则私有将仍然指向原始对象。

指向对象的线程安全性:

安全地进行操作的能力通过多个线程修改指向的对象取决于对象的实现。对于您的配置类,如果它允许并发写入而无需同步,例如添加或删除设置,则代码将不是线程安全的。

解决方案:

为了确保对象修改的线程安全,请使用std::mutex等同步机制来保护对shared_ptr对象或共享对象本身的访问。

最新教程 更多>
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-04-29
  • 将图片浮动到底部右侧并环绕文字的技巧
    将图片浮动到底部右侧并环绕文字的技巧
    在Web设计中围绕在Web设计中,有时可以将图像浮动到页面右下角,从而使文本围绕它缠绕。这可以在有效地展示图像的同时创建一个吸引人的视觉效果。 css位置在右下角,使用css float and clear properties: img { 浮点:对; ...
    编程 发布于2025-04-29
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-04-29
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-04-29
  • 详解Javascript事件循环机制及规则
    详解Javascript事件循环机制及规则
    众所周知,javacript是一种线程语言,但是为什么我们可以使用异步操作?因为异步操作是由具有多线程和多进程功能的浏览器执行的。 JavaScript始终在整个线程上运行,并在异步代码被验证时将其移交给浏览器以进行执行,然后浏览器调用相应的线程或进程,包括HTTP请求,GUI,事件触发等,以处理...
    编程 发布于2025-04-29
  • 如何从PHP中的数组中提取随机元素?
    如何从PHP中的数组中提取随机元素?
    从阵列中的随机选择,可以轻松从数组中获取随机项目。考虑以下数组:; 从此数组中检索一个随机项目,利用array_rand( array_rand()函数从数组返回一个随机键。通过将$项目数组索引使用此键,我们可以从数组中访问一个随机元素。这种方法为选择随机项目提供了一种直接且可靠的方法。
    编程 发布于2025-04-29
  • 在H2数据库中使用JDBC插入和获取`java.time.LocalDate`对象的技巧
    在H2数据库中使用JDBC插入和获取`java.time.LocalDate`对象的技巧
    使用JDBC在H2数据库等SQL数据库中插入和检索java.time.LocalDate对象 问题: 如何使用JDBC在H2数据库引擎等SQL数据库中插入和检索java.time类型(例如LocalDate)? 解答: 方法一:兼容JDBC 4.2的驱动程序 对于符合JDBC 4.2规范或更高版本...
    编程 发布于2025-04-29
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-04-29
  • 如何在php中使用卷发发送原始帖子请求?
    如何在php中使用卷发发送原始帖子请求?
    如何使用php 创建请求来发送原始帖子请求,开始使用curl_init()开始初始化curl session。然后,配置以下选项: curlopt_url:请求 [要发送的原始数据指定内容类型,为原始的帖子请求指定身体的内容类型很重要。在这种情况下,它是文本/平原。要执行此操作,请使用包含以下标头...
    编程 发布于2025-04-29
  • 如何从PHP会话数组中选择性删除特定变量?
    如何从PHP会话数组中选择性删除特定变量?
    在php session中删除PHP会话阵列中的特定变量,可以存储各种变量以供以后使用。但是,您可能会遇到只需要删除特定变量的情况。以下是完成此任务的方法: 开始,您已经定义了如何将变量添加到会话中。让我们专注于您打算使用Unset删除变量的部分。不幸的是,使用Unsot($ _会话['n...
    编程 发布于2025-04-29
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-04-29
  • Go语言垃圾回收如何处理切片内存?
    Go语言垃圾回收如何处理切片内存?
    Garbage Collection in Go Slices: A Detailed AnalysisIn Go, a slice is a dynamic array that references an underlying array.使用切片时,了解垃圾收集行为至关重要,以避免潜在的内存泄...
    编程 发布于2025-04-29
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 中,如果您使用一个大文件,并且需要从最后一行读取其内容,则在第一行到第一行,Python的内置功能可能不合适。这是解决此任务的有效解决方案:反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] ...
    编程 发布于2025-04-29
  • C#中Int与Int32:选哪个整数类型?
    C#中Int与Int32:选哪个整数类型?
    C# 中 int 和 Int32 的使用 在 C# 中处理整数时,您可能会遇到两个术语:int 和 Int32。这两个术语代表相同的数据类型,都存储 32 位整数。然而,一个常见的问题是:应该使用 int 还是 Int32? 虽然 int 和 Int32 的功能完全相同,但某些考虑因素可以指导您的...
    编程 发布于2025-04-29
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-04-29

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3