DispatchGroup
使用和有什么区别(优点和缺点)NSRecursiveLock
?
看起来他们正在做同样的事情。
DispatchGroup
使用和有什么区别(优点和缺点)NSRecursiveLock
?
看起来他们正在做同样的事情。
锁和组的用途非常不同。在处理一系列并发任务时:
锁通常用于防止/阻止这些任务同时与某些共享的、非线程安全的资源交互。
组通常用于标识这些并发任务何时全部完成(无论它们完成的顺序如何)。
例如,如果并行处理一系列图像,您可能会使用锁或类似机制来更新某些属性(例如结果数组),而调度组用于知道所有这些并发任务何时完成。
主要区别在于它DispatchGroup
更接近带有回调的计数信号量NSLock
,而 an是一个简单的 mutex。
例如, aDispatchGroup
可以被enter
一个或多个线程多次编辑,并且enter
aDispatchGroup
永远不会阻塞调用线程。调用线程还负责平衡每个enter
调用与对 的调用leave
。如果notify
组上注册了一个回调,它将在enter
s 的数量减去 s 的数量leave
达到 0 时执行。使用 a 的一个很好的例子DispatchGroup
是发出多个网络请求,然后执行一段回调代码所有网络请求都已完成(或超时等)。
但是,如果一个线程lock
是 an ,则任何其他线程(或者甚至是同一个线程,就此而言)在它被 ed 之前再次NSLock
尝试它,第二个线程将被阻塞直到它被ed (并且可能永远不会,如果你尝试它来自同一个线程两次)。使用 an 的一个很好的例子是提供对单个可变数据的多线程访问。在这种情况下,多个线程可以确保对可变存储进行一致的读取和写入,而不会相互干扰。lock
unlock
unlock
lock
NSLock
NSLock
(和一般的互斥锁)是比 a 低得多的同步原语DispatchGroup
。通常,您应该始终使用实现目标的最高级别原语。如果 aDispatchGroup
可以完成这项工作,请使用它,然后忽略NSLock
.