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