首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带GCD的读写锁

带GCD的读写锁
EN

Stack Overflow用户
提问于 2012-04-20 02:16:28
回答 2查看 8.2K关注 0票数 10

我的应用程序大量使用GCD,几乎所有东西都被拆分成由dispatches处理的小任务。但是,底层数据模型主要是读取的,只是偶尔会写入。

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

我发现了这个实现:http://cocoaheads.byu.edu/wiki/locks。我的问题是,既然GCD使用了PThreads,那么这个实现能与GCD一起工作吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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,您可以了解更多有关此内容的信息。

票数 26
EN

Stack Overflow用户

发布于 2012-04-24 16:35:08

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10234261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档