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

时间:2019-09-25 20:49:37

标签: multithreading grand-central-dispatch nslock

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

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

2 个答案:

答案 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)

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

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

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

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