ios - 我们可以允许从两个线程同时操作 NSMutableArray 的不同 "indexes"

标签 ios objective-c multithreading thread-safety grand-central-dispatch

NSMutableArray 不是线程安全的,但我不明白为什么只要同时操作不同的索引就不能将它们设计为线程安全的。例如。 Index 1 指向类 X 的一个实例,Index 2 指向另一个实例。允许同时操作这两个对象不是很高效吗?当我使用 GCD 时是否允许这样做,或者当我更改不同索引指向的对象时是否需要使用调度屏障?

最佳答案

可以这样想。

您的数组包含指向对象的指针。指针本质上是路标,指向对象在内存中的位置。

现在,当您改变一个对象时,您实际上并没有触及任何指向该对象的指针。对象在内存中的位置不受影响。

因此,从数组的角度来看,当您改变数组中的对象本身时,什么也不会发生,因为指针不受影响。 这意味着从不同线程改变数组中的不同对象是完全安全的。

因此,当您说将数据并行下载到数组中的不同对象中更有效时,您是正确的。

只要您不改变数组本身(添加或删除对象)同时改变相同对象,你会没事的。

如果您确实需要同时从多个线程改变数组,那么您说得对,您应该使用并发队列,具有写入屏障和标准读取分派(dispatch)。这将允许多个并发读取(这是完全安全的),并将串行写入和读取。

关于ios - 我们可以允许从两个线程同时操作 NSMutableArray 的不同 "indexes",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35835263/

相关文章:

objective-c - 当我不知道 UITableView 有多少个部分时,如何重新加载 UITableView 的数据?

c# - 使类字段线程安全

ios - Swift AVAudioPlayer 从头开始​​重启

html - 如何从 iOS 中的文件中解析 JSON?

ios - iPad 普通话翻译 API

ios - 指向整数转换的不兼容指针将 'id' 发送到类型为 'int' 的参数

ios - CoreData 的 performBlock : and faulting

ios - 如何在不使用 segue 的情况下在 View Controller 之间传递数据

.net - .NET向Windows/Linux进程和线程添加了什么?

java - Android 线程和电池生命周期