【问题标题】:Can we allow different "indexes" of a NSMutableArray to be manipulated simultaneously from two threads我们可以允许从两个线程同时操作 NSMutableArray 的不同“索引”吗
【发布时间】:2016-03-07 02:30:51
【问题描述】:

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

【问题讨论】:

  • 您希望对数组进行哪些操作?
  • 数组的每个元素都指向一个“照片”对象。最初,只有类的 URL 和名称属性是已知的。然后我开始下载 URL 的图像,然后对接收到的图像数据应用一些过滤器。下载是并行进行的。当每个 DL 完成时,会执行一个完成块,将接收到的数据存储在该类的一个属性中,然后执行过滤操作并将过滤后的数据存储在该类的另一个属性中。即使我在没有调度障碍的并发 Q 中运行它,我也没有看到崩溃。 bcos 这样的操作可以吗?
  • 你正在做的很好。并发读取是安全的,当您操作数组包含的对象时,您并没有在操作数组。
  • 谢谢,阿维。这是否意味着只需要使用“屏障”保护阵列中的添加或删除?或者当然,从两个线程操作数组指向的同一个对象(例如,在我的例子中,需要保护两个线程更改给定数组索引指向的“照片”对象)?

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


【解决方案1】:

这样想。

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多