使用 DispatchGroup 和 NSRecursiveLock 有什么区别(优点和缺点)?

What is the difference (advantage and disadvantage) between using DispatchGroup and NSRecursiveLock?

使用DispatchGroupNSRecursiveLock有什么区别(优势和劣势)?

看起来他们在做完全一样的事情。

主要区别在于 DispatchGroup 更接近带有回调的 计数信号量 ,而 NSLock 简单互斥

例如,一个 DispatchGroup 可以被一个或多个线程多次 entered,并且 entering a DispatchGroup 永远不会阻塞调用线。调用线程还负责平衡每个 enter 调用与对 leave 的调用。如果组上注册了一个notify回调,一旦enter的数量减去leave的数量达到0,它就会执行。使用[=10的一个很好的例子=] 将发出多个网络请求,并在所有网络请求完成(或超时等)后执行一段回调代码。

但是,如果一个线程 lockNSLock,则任何其他线程(甚至是同一个线程,就此而言)会在它 lock 之前再次尝试 lock =25=]ed,第二个线程将被阻塞,直到它被 unlocked(并且可能永远不会,如果你试图从同一个线程 lock 它两次)。使用 NSLock 的一个很好的例子是提供对单个可变数据的多线程访问。在这种情况下,多个线程可以确保获得连贯的读写 to/from 可变存储,而不会潜在地相互践踏。

NSLock(和一般的互斥量)是比 DispatchGroup 级别低得多的同步原语。通常,您应该始终使用实现您的目标的最高级别原语。如果 DispatchGroup 可以完成工作,请使用它,并忽略 NSLock.

锁和组的用途截然不同。处理一系列并发任务时:

  • 锁通常用于 prevent/block 这些任务与一些共享的、非线程安全的资源同时交互。

  • 组一般用于标识这些并发任务何时全部完成(不管它们完成的顺序如何)。

例如,如果并行处理一系列图像,您可能会使用锁或类似机制来更新一些 属性(例如结果数组),而调度组用于了解当所有这些并发任务都完成时。