我的应用程序大量使用GCD,几乎所有东西都被拆分成由dispatches处理的小任务。但是,底层数据模型主要是读取的,只是偶尔会写入。
目前,我使用锁来防止在读取时更改关键数据结构。但是今天在研究了更多的锁之后,我发现了NSConditionLock和一些关于读写锁的页面。后者正是我所需要的。
我发现了这个实现:http://cocoaheads.byu.edu/wiki/locks。我的问题是,既然GCD使用了PThreads,那么这个实现能与GCD一起工作吗?
发布于 2012-04-20 02:52:21
它仍然可以工作。pthreads是一个线程API,它是Mac上所有其他使用线程的API的基础(在它下面有Mach线程激活,但这是SPI,而不是API)。无论如何,pthread锁实际上并不要求您使用pthread线程。
然而,从iOS 5开始,,GCD提供了一个更好的选择:dispatch_barrier_async()。基本上,你有一个私有的并发队列。您以正常的方式将所有读取操作提交给它。您可以使用屏障例程向它提交写操作。答-达!读写锁定。
如果您有权访问WWDC 2011 session video for Session 210 - Mastering Grand Central Dispatch,您可以了解更多有关此内容的信息。
发布于 2012-04-24 16:35:08
您可能还需要考虑为所有读/写操作维护一个串行队列。然后,您可以对该队列执行dispatch_sync()写入操作,以确保对数据模型的更改能够迅速应用,并对所有读取操作执行dispatch_async()操作,以确保在应用程序中保持良好的性能。
由于只有一个串行队列,所有的读写操作都在该队列上进行,因此可以确保在写操作期间不会发生任何读操作。这比锁的开销小得多,但这意味着你不能同时执行多个“读”操作。这不太可能对大多数应用程序造成问题。
使用dispatch_barrier_async()可能意味着您进行的写操作需要花费任意数量的时间才能实际提交,因为队列中所有预先存在的任务都必须在障碍块执行之前完成。
https://stackoverflow.com/questions/10234261
复制相似问题