Objective c 大中央调度:控制数据结构访问的队列与信号量?
我是用Macruby来做这件事的,但我认为这在这里不太重要 我有一个模型,它将状态存储在字典数据结构中。我希望并发操作偶尔更新此数据结构。在我看来,GCD提供了几种可能的解决方案,包括以下两种:Objective c 大中央调度:控制数据结构访问的队列与信号量?,objective-c,cocoa,macruby,grand-central-dispatch,Objective C,Cocoa,Macruby,Grand Central Dispatch,我是用Macruby来做这件事的,但我认为这在这里不太重要 我有一个模型,它将状态存储在字典数据结构中。我希望并发操作偶尔更新此数据结构。在我看来,GCD提供了几种可能的解决方案,包括以下两种: 将访问数据结构的任何代码包装在发送到某个串行队列的块中 使用GCD信号量,客户端代码在访问结构时根据需要发送等待/信号调用 当第一个解决方案中的队列被同步调用时,它看起来与信号量解决方案相当。这两种解决方案是否都有我没有的明显优势?有没有更好的选择我错过了 另外:使用GCD实现读写(共享独占)锁是否
- 将访问数据结构的任何代码包装在发送到某个串行队列的块中
- 使用GCD信号量,客户端代码在访问结构时根据需要发送等待/信号调用
- 专业人士
- 没有锁
- 缺点
- 任务不能在串行队列中同时工作
- 专业人士
- 任务可以同时工作
- 缺点
- 它使用锁,即使它很轻
在串行队列上使用
调度同步
保护对数据结构的访问在语义上等同于使用调度信号量,在无争用的情况下,它们都应该非常快。如果性能很重要,则对其进行基准测试,并查看是否存在任何显著差异
至于readers-writer锁,你确实可以在GCD上构建一个,至少,前几天我拼凑了一些似乎有效的东西。(警告:存在龙/未经良好测试的代码。)我的解决方案在提交到全局并发队列之前,通过中间串行队列将读/写请求导入。串行队列在适当的时间被挂起/恢复,以确保写入请求以串行方式执行
我想要一个能够模拟私有并发调度队列的东西,该队列允许同步点,这是公共GCDAPI中没有公开的,但用于将来的 在前面的回答中添加一个警告(最终成为调度队列的一个con)
您需要注意调度队列的调用方式,因为有些隐藏的场景在我遇到它们之前都不是很明显
我用调度队列替换了许多关键部分上的NSLock和@synchronized,目的是实现轻量级同步。不幸的是,我遇到了一个导致死锁的情况,我已经将其恢复到使用dispatch\u barrier\u async/dispatch\u sync模式。看起来,即使在创建并发队列时,dispatch_sync也可能会机会主义地调用其在主队列上的块(如果已经在那里执行)。这是一个问题,因为当前调度队列上的调度同步会导致死锁
我想我会向后移动,在这些区域使用另一种锁定技术