使用GCD进行读写锁定

时间:2012-04-19 18:16:28

标签: iphone objective-c multithreading locking grand-central-dispatch

我的应用程序大量使用GCD,几乎所有内容都分散在由调度处理的小任务中。但是,基础数据模型主要是读取的,只是偶尔写入。

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

我找到了这个实现:http://cocoaheads.byu.edu/wiki/locks。我的问题是,这个实现是否适用于GCD,看到它使用PThreads?

2 个答案:

答案 0 :(得分:23)

它仍然可以使用。 pthreads是线程API,是Mac OS X上所有其他使用线程的API的基础。(在那里有Mach线程激活,但那是SPI,而不是API。)无论如何,pthreads锁并不需要你使用pthreads线程。

然而,从iOS 5开始,GCD提供了更好的选择:dispatch_barrier_async()。基本上,您有一个私有并发队列。您以正常方式向其提交所有读取操作。您可以使用barrier例程向其提交写入操作。当当!读写锁定。

如果您有权访问WWDC 2011 session video for Session 210 - Mastering Grand Central Dispatch,则可以了解详情。

答案 1 :(得分:2)

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

由于您有一个串行队列可以在其上进行所有读写操作,因此确保在写入期间不会发生任何读取操作。这比锁定成本低得多,但这意味着您无法同时执行多个“读取”操作。这不太可能导致大多数应用程序出现问题。

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