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/

相关文章:

iOS - TableView willDisplayCell 动画仅在用户向下滚动而不是顶部时发生

c++ - LRU 缓存和多线程

c - 当客户端崩溃时,recv 返回 0 而不是 -1

multithreading - 同时执行多个线程循环的并发编程?

ios - RESKit : Duplicate objects are created

iOS ReactNative React 依赖问题

ios - Swift 开发过程中,资源文件放在哪里?

ios - 如何在 Xcode 6.1 中获取 iPod Touch 模拟器

iphone - 嵌套表格 View 的视差

ios - 使用iOS 8 cameraViewTransform的UIImagePickerController无法缩放