gpt4 book ai didi

objective-c - 如果 NSMutableArray 被多个线程同时修改会怎样? (如果它包含的对象保留在别处)

转载 作者:太空狗 更新时间:2023-10-30 03:40:08 25 4
gpt4 key购买 nike

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

如果在我使用 [NSMutableArray arrayWithArray:someArray] 复制数组时对数组进行了更改,会发生什么情况;

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

我不确定如何测试这种情况。

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

最佳答案

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

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

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

更新

...What happens? Does the copy contain all 5 objects (since they are retained elsewhere anyway? Do they contain 4? (even containing 4 is sufficient for me) Is an exception thrown ?

如果你没有适本地保护集合,它就像未定义的行为一样好,如果它崩溃你很幸运。

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

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

我鼓励你适本地保护或采取其他方法。 UB 是邪恶的 :)

关于objective-c - 如果 NSMutableArray 被多个线程同时修改会怎样? (如果它包含的对象保留在别处),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7319431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com