如果多个线程同时修改 NSMutableArray 会发生什么? (如果它包含的对象保留在其他地方)

2023-11-25

我有一个包含许多对象的 NSMutableArray。

如果在我使用 [NSMutableArray array With Array:some Array] 复制数组时对数组进行更改,会发生什么情况?

例如:如果在复制时从数组中删除一个对象?

我不确定如何测试这个场景。

编辑:对象不会被释放(因为它们被保留在别处)。我只是使用这个数组作为查找表。


如您所知,不能保证容器/集合是线程安全的。什么could如果在复制或读取时更改数组会发生什么情况?很多东西。明显的情况是,它可能当时正在重新分配,它可能会传递或返回一个无效的引用给您(例如最近删除的引用),或者它可能会访问已释放的对象(从另一个线程)。除了会使您的应用程序崩溃或导致其他 UB 的情况外,它可能不会返回正确或一致的值。这是对数据的误解。两者都不好。

你不test场景 - 线程问题很难重现,并且您实际上永远无法涵盖所有​​情况。因为对象本身不能保证线程安全 - 您的实现必须一次限制对一个线程的访问/突变/交互。当处理多线程上下文中使用的对象时:每当您访问或查询对象的可变状态的信息时,您都应该保护该对象(例如使用锁)。因此,您只需在使用时将其锁定即可。锁定/复制/解锁/使用副本也很常见。对于 NSMutableArray,可变状态的示例是其所有对象及其计数。它的操作和突变也使用对象的可变状态,因此它们受到限制。

如果您仅从一个线程使用该对象,那么显然不需要锁定它。这也是为什么在大多数情况下传递副本和保存不可变变体都是好主意的原因。您不需要为每个对象都加一个锁,为持有该对象的对象设置一个保护通常是设计线程安全类的好方法。

Update

...会发生什么?副本是否包含所有 5 个对象(因为它们无论如何都保留在其他地方?它们包含 4 个吗?(甚至包含 4 个对我来说就足够了)是否抛出异常?

如果你没有正确地保护集合,那么它就像未定义的行为一样,如果它崩溃了,那你就很幸运了。

您需要采取适当的预防措施来避免未定义的行为。当你的程序没有得到适当的保护时,它就在该域中运行。

详细说明一下:将对象保留在外部只会减少未定义行为的可能性,但肯定不会消除它。后果的更多示例包括异常、段错误、读取或写入用作另一个活动分配的内存(这可能会显示为非常神秘的问题,实际上也可能无法重现)。

我鼓励你适当防范或采取其他方法。 UB 是邪恶的:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果多个线程同时修改 NSMutableArray 会发生什么? (如果它包含的对象保留在其他地方) 的相关文章

随机推荐

  • 如何安装ROracle包?

    我正在尝试使用安装 ROracle 包install packages ROracle 但每次我收到这条消息 Package which is only available in source form and may need compi
  • 如何检查对象是否已存在于列表中

    我有一个清单 List
  • 将变量传递给现代中继中的片段容器

    我在用着现代接力 兼容 我有一个片段 其中包含一个具有一个参数的字段 但我找不到一种从父组件传递变量值的方法 MyFragmentComponent jsx class MyFragmentComponent extends Compone
  • stl容器如何被删除?

    stl 中的向量等容器对象如何被销毁 即使它们是在堆中创建的 EDIT 如果容器保存指针那么如何销毁这些指针对象 指针的 STL 容器不会清除所指向的数据 它只会清理指针所在的空间 如果您希望向量清理指针数据 您需要使用某种智能指针实现 s
  • 辅助路由仅适用于根组件吗?

    我在子组件中设置辅助路由时遇到问题 由于某种原因 只有那些从根组件开始的辅助路由才起作用 这是我的路由器设置 export const routes RouterConfig path test1 component Test1Compon
  • 如何将数据合并到 XDP 文件并返回 PDF(通过 .NET)?

    我的团队有一个使用 Adob e LiveCycle 设计器创建的模板 XDP 情况 我们正在替换旧的 Acrobat 表单 XFDF 格式 使用此 LiveCycle 作为更大升级的一部分 当前的 Acrobat 格式是 动态填充基本数据
  • 更改 Azure 数据库端口

    是否可以更改天蓝色服务器使用的端口 我目前只看到添加可用于访问服务器的 IP 地址的功能 或者防火墙是否需要允许端口 1433 出站流量 假设您指的是 SQL 数据库服务及其关联的防火墙 则否 您只能将 IP 地址添加到防火墙以进行访问 无
  • set -- “$@” “$i” 在 Bash 中是什么意思?

    The set以下循环中的命令让我感到困惑 for i in do set i what does it mean done 我能够了解 是所有位置参数 并且 i是位置参数之一 但是 我不明白什么 set i means 它附加了值 i到位
  • 从视频url获取视频缩略图

    是否可以从视频 URL 中获取缩略图 我需要列表视图中的视频缩略图 是的 可以使用 ThumbnailUtils 获取视频的缩略图 FileOutputStream out File land new File Environment ge
  • Mapstruct LocalDateTime 到 Instant

    我是 Mapstruct 的新手 我有一个模型对象 其中包括LocalDateTime类型字段 DTO 包括Instant类型字段 我想要地图LocalDateTime将字段键入Instant类型字段 我有TimeZone传入请求的实例 像
  • 使用 javamail 的 IMAP 访问邮件 Office 365

    我正在尝试使用 JavaMail 1 4 api 读取电子邮件帐户 Office365 的文件夹中的电子邮件 我的代码是 public static void main String argv throws Exception Get a
  • FFMPEG:如何以高关键帧间隔对可搜索视频进行编码

    我正在寻找一个 ffmpeg 命令 如果我在 requestAnimationFrame 上控制视频以进行鼠标控制 则该命令最适合使用 基本上 它需要快速搜索并以高关键帧间隔进行编码 我似乎无法确定哪些参数有助于快速搜索和高关键帧 谢谢 约
  • GCD 和线程过多的问题

    我有一个图像加载器类 它提供 NSURL 加载和来自网络的图像并执行完成块 代码其实很简单 void downloadImageWithURL NSString URLString completion BELoadImageComplet
  • 解析 NSURL 查询属性

    我有一个像这样的网址myApp action 1 parameter 2 secondparameter 3 通过属性查询 我得到了以下部分URL parameter 2 secondparameter 3 有什么方法可以轻松地将其放入NS
  • 如何向一个号码发送多条短信

    我想通过使用复选框选择发送多条短信 仅选定的短信内容 即它们的正文需要发送新的消息正文到我预定义的 121 但下面的代码 无论我是否选择 否 121 它都会发送完整的收件箱消息 主要活动代码 public class MainActivit
  • Tomcat如何处理多个请求

    我知道创建网络应用程序 但我有一个基本的疑问 我很抱歉问了非常愚蠢的问题 但想消除我的疑虑 Tomcat容器如何处理请求 我的意思是当我发送请求时home jsp页面然后我得到的响应为home jsp仅页面而不是注册 jsp该页面同时可能是
  • 每当视图寻呼机中的选项卡发生更改时如何更新列表

    在我的应用程序中 我使用视图寻呼机来使用导航选项卡 我已经能够使用发布的代码成功绘制选项卡 https github com codepath android guides wiki Sliding Tabs with PagerSlidi
  • Gson 和抽象超类:反序列化问题

    假设有一个abstract类 说A 以及两个非抽象子类 例如A1 and A2 我想使用 json 格式 反序列化 它们GSON库 例如 我得到一个数组A对象 int n A list new A n A 0 new A1 A 1 new
  • 使用 CLI 通过 HTTPS 运行 Flask 开发服务器

    我正在尝试使用 HTTPS 来提供 Flask 应用程序flask命令 我可以使用以下方法来做到这一点app run通过通过ssl context争论 但我不知道如何在 CLI 上执行此操作 flask run host 0 0 0 0 p
  • 如果多个线程同时修改 NSMutableArray 会发生什么? (如果它包含的对象保留在其他地方)

    我有一个包含许多对象的 NSMutableArray 如果在我使用 NSMutableArray array With Array some Array 复制数组时对数组进行更改 会发生什么情况 例如 如果在复制时从数组中删除一个对象 我不