10

我的应用程序大量使用了 GCD,几乎所有内容都被拆分为由调度处理的小任务。但是,底层数据模型大部分是读取的,只是偶尔写入。

我目前使用锁来防止在阅读时更改关键数据结构。但是今天在查看锁之后,我发现了 NSConditionLock 和一些关于读写锁的页面。后者正是我所需要的。

我找到了这个实现:http ://cocoaheads.byu.edu/wiki/locks 。我的问题是,这个实现是否可以与 GCD 一起使用,因为它使用 PThreads?

4

2 回答 2

27

它仍然可以工作。pthreads 是 Mac OS X 上所有其他线程使用 API 的基础线程 API。(在此之下有 Mach 线程激活,但那是 SPI,而不是 API。)无论如何,pthreads 锁并不真正要求您使用 pthreads线程。

但是,从 iOS 5 开始,GCD 提供了更好的选择:dispatch_barrier_async(). 基本上,您有一个私有并发队列。您以正常方式向它提交所有读取操作。您使用屏障例程向它提交写操作。达达!读写锁定。

如果您可以访问WWDC 2011 会议视频 Session 210 - Mastering Grand Central Dispatch,您可以了解更多信息。

于 2012-04-19T18:52:21.363 回答
2

您可能还需要考虑为所有读/写操作维护一个串行队列。然后,您可以dispatch_sync()写入该队列以确保及时应用对数据模型的更改以及dispatch_async()所有读取以确保您在应用程序中保持良好的性能。

由于您有一个串行队列,所有读取和写入都发生在该队列上,因此您可以确保在写入期间不会发生读取。这比锁的成本要低得多,但这意味着您不能同时执行多个“读取”操作。这不太可能对大多数应用程序造成问题。

使用dispatch_barrier_async()可能意味着您进行的写入需要花费任意时间才能实际提交,因为队列中的所有预先存在的任务都必须在您的屏障块执行之前完成。

于 2012-04-24T08:35:07.530 回答