我有一个使用可变数组的类,该数组在大量读取(新项目到达)后修改一次。
问题是,当需要改变数组时,读取会不断涌现。
目前,为了避免每次读取它在副本上执行的操作时出现此问题:
[[theArray copy] operation] //operation being indexOfObject:, objectAtIndex: objectsAtIndexes:, etc.
副本变得非常昂贵,尤其是在没有必要的时候(所有这些时候数组没有被改变)。
如何在数组发生变化时锁定数组以延迟对它的访问?
最佳答案
将所有数组访问放到一个串行调度队列中。这将防止任何两个操作同时发生。参见 "Eliminating Lock-based Code"在并发编程指南中。
如果你可以要求 iOS >= 4.3,你可以使用并发自定义队列和 dispatch barriers用于突变操作。这将允许读取同时发生,但是当需要写入时,它们将被暂停直到写入完成。作为屏障提交的 block 本质上是在并发队列上串行执行——直到所有先前的 block 都完成后它才会开始,任何后续 block 也不会在屏障 block 完成之前开始。 (这是 Justin 提到的读写锁的 GCD 版本。)我将您引向无与伦比的 Mike Ash samples of this。 .
关于objective-c - 避免复制 NSMutableArray 以使用多线程写入进行读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11890522/