我们是否可以允许从两个线程同时操作NSMutableArray的不同“索引”

时间:2016-03-07 02:30:52

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

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

1 个答案:

答案 0 :(得分:1)

这样想。

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

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

因此,从数组的角度来看,当你在其中改变对象时, nothing 会发生,因为指针不受影响。 这意味着从不同的线程中改变数组中的不同对象是非常安全的。

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

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

如果你需要同时从多个线程变异数组,你说你应该使用一个并发队列,一个写入障碍,一个标准分派来读取。这将允许多个并发读取(这是非常安全的)并将序列化带有读取的写入。