1

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

看起来他们正在做同样的事情。

4

2 回答 2

3

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

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

  • 组通常用于标识这些并发任务何时全部完成(无论它们完成的顺序如何)。

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

于 2019-09-26T15:02:15.447 回答
1

主要区别在于它DispatchGroup更接近带有回调的计数信号量NSLock,而 an是一个简单的 mutex

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

但是,如果一个线程lock是 an ,则任何其他线程(或者甚至是同一个线程,就此而言)在它被 ed 之前再次NSLock尝试它,第二个线程将被阻塞直到它被ed (并且可能永远不会,如果你尝试它来自同一个线程两次)。使用 an 的一个很好的例子是提供对单个可变数据的多线程访问。在这种情况下,多个线程可以确保对可变存储进行一致的读取和写入,而不会相互干扰。lockunlockunlocklockNSLock

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

于 2019-09-25T21:32:41.863 回答