2016-10-01 30 views

回答

14

dispatch_barrier_[a]sync意指与并发队列使用。它们也用于与dispatch_[a]sync一起使用。

常见的用法是“多读者,一个作者”模式。你建立一个并发队列。对于“阅读器”块,您使用dispatch_[a]sync。对于“作家”块,您使用dispatch_barrier_[a]sync

此设置允许并发阅读,但一次只允许一个作者,并且在写作发生时不能阅读。

将此与一次只能有一个块发生的串行队列进行比较。

5

你的图完美地说明了屏障是如何工作的。七个方块已经发送到一个并发队列中,四个没有障碍物(图中的方块1到4),一个障碍物(图中褐色的“障碍块”),然后再没有障碍物的两个方块图中的块5和6)。

正如你所看到的,前四个并发运行,但障碍块将不会运行,直到前四个完成。直到“障碍物”完成后,最后两个才会开始。

与此相比,一个串行队列,在没有任务可以同时运行:

comparison

如果每块分派给并发队列用屏障布控,那么你是对的,那这将等同于使用串行队列。但是,只有当您将屏障调度块与并发队列上的非屏障调度块组合起来时,屏障才能发挥作用。所以,当你想享受并发行为时,不要使用障碍。但是,对于并发队列中的单个块需要类似串行的行为,请使用屏障。

一个例子是,你可能会派出10个没有障碍的街区,但随后添加一个障碍物的第11个街区。因此,前10名可以相互并行运行,但是11名只会在前10名完成(实现“完成处理程序”行为)时开始。

或者正如rmaddy所说(+1),屏障的另一个常见用途是您访问某个共享资源的位置,您将允许其允许并发读取(无障碍),但必须强制执行同步写入(有障碍)。在这种情况下,您经常使用dispatch_sync作为读取,dispatch_barrier_async作为写入使用。

相关问题