Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 大中央调度:控制数据结构访问的队列与信号量?_Objective C_Cocoa_Macruby_Grand Central Dispatch - Fatal编程技术网

Objective c 大中央调度:控制数据结构访问的队列与信号量?

Objective c 大中央调度:控制数据结构访问的队列与信号量?,objective-c,cocoa,macruby,grand-central-dispatch,Objective C,Cocoa,Macruby,Grand Central Dispatch,我是用Macruby来做这件事的,但我认为这在这里不太重要 我有一个模型,它将状态存储在字典数据结构中。我希望并发操作偶尔更新此数据结构。在我看来,GCD提供了几种可能的解决方案,包括以下两种: 将访问数据结构的任何代码包装在发送到某个串行队列的块中 使用GCD信号量,客户端代码在访问结构时根据需要发送等待/信号调用 当第一个解决方案中的队列被同步调用时,它看起来与信号量解决方案相当。这两种解决方案是否都有我没有的明显优势?有没有更好的选择我错过了 另外:使用GCD实现读写(共享独占)锁是否

我是用Macruby来做这件事的,但我认为这在这里不太重要

我有一个模型,它将状态存储在字典数据结构中。我希望并发操作偶尔更新此数据结构。在我看来,GCD提供了几种可能的解决方案,包括以下两种:

  • 将访问数据结构的任何代码包装在发送到某个串行队列的块中
  • 使用GCD信号量,客户端代码在访问结构时根据需要发送等待/信号调用
当第一个解决方案中的队列被同步调用时,它看起来与信号量解决方案相当。这两种解决方案是否都有我没有的明显优势?有没有更好的选择我错过了

另外:使用GCD实现读写(共享独占)锁是否简单?

串行队列

  • 专业人士
    • 没有锁
  • 缺点
    • 任务不能在串行队列中同时工作
GCD信号量

  • 专业人士
    • 任务可以同时工作
  • 缺点
    • 它使用锁,即使它很轻
我们也可以使用原子操作来代替GCD信号量。在某些情况下,它将比GCD信号量轻


在串行队列上使用
调度同步
保护对数据结构的访问在语义上等同于使用调度信号量,在无争用的情况下,它们都应该非常快。如果性能很重要,则对其进行基准测试,并查看是否存在任何显著差异

至于readers-writer锁,你确实可以在GCD上构建一个,至少,前几天我拼凑了一些似乎有效的东西。(警告:存在龙/未经良好测试的代码。)我的解决方案在提交到全局并发队列之前,通过中间串行队列将读/写请求导入。串行队列在适当的时间被挂起/恢复,以确保写入请求以串行方式执行

我想要一个能够模拟私有并发调度队列的东西,该队列允许同步点,这是公共GCDAPI中没有公开的,但用于将来的

在前面的回答中添加一个警告(最终成为调度队列的一个con)

您需要注意调度队列的调用方式,因为有些隐藏的场景在我遇到它们之前都不是很明显

我用调度队列替换了许多关键部分上的NSLock和@synchronized,目的是实现轻量级同步。不幸的是,我遇到了一个导致死锁的情况,我已经将其恢复到使用dispatch\u barrier\u async/dispatch\u sync模式。看起来,即使在创建并发队列时,dispatch_sync也可能会机会主义地调用其在主队列上的块(如果已经在那里执行)。这是一个问题,因为当前调度队列上的调度同步会导致死锁

我想我会向后移动,在这些区域使用另一种锁定技术