我的应用程序大量使用GCD,几乎所有的操作都是通过调度处理小任务完成的。然而,底层数据模型主要是读取,只有偶尔进行写入。
我目前使用锁来防止在读取关键数据结构时发生更改。但是今天在进一步研究锁时,我发现了NSConditionLock和一些与读写锁相关的页面。后者正是我需要的。
我找到了这个实现:http://cocoaheads.byu.edu/wiki/locks。我的问题是,这个实现是否能够与GCD一起使用,因为它使用了PThreads?
我的应用程序大量使用GCD,几乎所有的操作都是通过调度处理小任务完成的。然而,底层数据模型主要是读取,只有偶尔进行写入。
我目前使用锁来防止在读取关键数据结构时发生更改。但是今天在进一步研究锁时,我发现了NSConditionLock和一些与读写锁相关的页面。后者正是我需要的。
我找到了这个实现:http://cocoaheads.byu.edu/wiki/locks。我的问题是,这个实现是否能够与GCD一起使用,因为它使用了PThreads?
它仍然可以工作。 pthreads是Mac OS X上所有其他使用线程API的基础线程API。(在那之下有Mach线程激活,但那是SPI,而不是API.) 无论如何,pthread锁实际上不需要您使用pthread线程。
然而,自iOS 5以来,GCD提供了更好的替代方案:dispatch_barrier_async()
。基本上,你有一个私有并发队列。你按照正常方式将所有读操作提交给它。你使用屏障例程将写操作提交给它。泰达!读写锁定。
如果您可以访问WWDC 2011会话视频210 - 掌握Grand Central Dispatch,您可以了解更多相关信息。
dispatch_sync()
将写操作分派到该队列中,以确保对数据模型的更改立即生效,并使用dispatch_async()
将所有读操作分派到队列中,以确保应用程序具有良好的性能。dispatch_barrier_async()
可能意味着你所做的写操作需要任意长的时间才能真正提交,因为必须完成队列中的所有预先存在的任务,然后才能执行你的屏障块。