使用 DispatchGroup 和 NSRecursiveLock 有什么区别(优点和缺点)?
What is the difference (advantage and disadvantage) between using DispatchGroup and NSRecursiveLock?
使用DispatchGroup
和NSRecursiveLock
有什么区别(优势和劣势)?
看起来他们在做完全一样的事情。
主要区别在于 DispatchGroup
更接近带有回调的 计数信号量 ,而 NSLock
是 简单互斥。
例如,一个 DispatchGroup
可以被一个或多个线程多次 enter
ed,并且 enter
ing a DispatchGroup
永远不会阻塞调用线。调用线程还负责平衡每个 enter
调用与对 leave
的调用。如果组上注册了一个notify
回调,一旦enter
的数量减去leave
的数量达到0,它就会执行。使用[=10的一个很好的例子=] 将发出多个网络请求,并在所有网络请求完成(或超时等)后执行一段回调代码。
但是,如果一个线程 lock
是 NSLock
,则任何其他线程(甚至是同一个线程,就此而言)会在它 lock
之前再次尝试 lock
=25=]ed,第二个线程将被阻塞,直到它被 unlock
ed(并且可能永远不会,如果你试图从同一个线程 lock
它两次)。使用 NSLock
的一个很好的例子是提供对单个可变数据的多线程访问。在这种情况下,多个线程可以确保获得连贯的读写 to/from 可变存储,而不会潜在地相互践踏。
NSLock
(和一般的互斥量)是比 DispatchGroup
级别低得多的同步原语。通常,您应该始终使用实现您的目标的最高级别原语。如果 DispatchGroup
可以完成工作,请使用它,并忽略 NSLock
.
锁和组的用途截然不同。处理一系列并发任务时:
锁通常用于 prevent/block 这些任务与一些共享的、非线程安全的资源同时交互。
组一般用于标识这些并发任务何时全部完成(不管它们完成的顺序如何)。
例如,如果并行处理一系列图像,您可能会使用锁或类似机制来更新一些 属性(例如结果数组),而调度组用于了解当所有这些并发任务都完成时。
使用DispatchGroup
和NSRecursiveLock
有什么区别(优势和劣势)?
看起来他们在做完全一样的事情。
主要区别在于 DispatchGroup
更接近带有回调的 计数信号量 ,而 NSLock
是 简单互斥。
例如,一个 DispatchGroup
可以被一个或多个线程多次 enter
ed,并且 enter
ing a DispatchGroup
永远不会阻塞调用线。调用线程还负责平衡每个 enter
调用与对 leave
的调用。如果组上注册了一个notify
回调,一旦enter
的数量减去leave
的数量达到0,它就会执行。使用[=10的一个很好的例子=] 将发出多个网络请求,并在所有网络请求完成(或超时等)后执行一段回调代码。
但是,如果一个线程 lock
是 NSLock
,则任何其他线程(甚至是同一个线程,就此而言)会在它 lock
之前再次尝试 lock
=25=]ed,第二个线程将被阻塞,直到它被 unlock
ed(并且可能永远不会,如果你试图从同一个线程 lock
它两次)。使用 NSLock
的一个很好的例子是提供对单个可变数据的多线程访问。在这种情况下,多个线程可以确保获得连贯的读写 to/from 可变存储,而不会潜在地相互践踏。
NSLock
(和一般的互斥量)是比 DispatchGroup
级别低得多的同步原语。通常,您应该始终使用实现您的目标的最高级别原语。如果 DispatchGroup
可以完成工作,请使用它,并忽略 NSLock
.
锁和组的用途截然不同。处理一系列并发任务时:
锁通常用于 prevent/block 这些任务与一些共享的、非线程安全的资源同时交互。
组一般用于标识这些并发任务何时全部完成(不管它们完成的顺序如何)。
例如,如果并行处理一系列图像,您可能会使用锁或类似机制来更新一些 属性(例如结果数组),而调度组用于了解当所有这些并发任务都完成时。