我发现dispatch_barrier_async的工作机制在于,只有先前添加到队列中的所有块都已完成,才会执行该工作机制。它的工作方式与串行队列相似。GCD中的Dispatch_barrier_async和串行队列,它们之间有什么区别?
因此,我没有区分这两种运行模式在GCD中的区别。
我发现dispatch_barrier_async的工作机制在于,只有先前添加到队列中的所有块都已完成,才会执行该工作机制。它的工作方式与串行队列相似。GCD中的Dispatch_barrier_async和串行队列,它们之间有什么区别?
因此,我没有区分这两种运行模式在GCD中的区别。
dispatch_barrier_[a]sync
意指与并发队列使用。它们也用于与dispatch_[a]sync
一起使用。
常见的用法是“多读者,一个作者”模式。你建立一个并发队列。对于“阅读器”块,您使用dispatch_[a]sync
。对于“作家”块,您使用dispatch_barrier_[a]sync
。
此设置允许并发阅读,但一次只允许一个作者,并且在写作发生时不能阅读。
将此与一次只能有一个块发生的串行队列进行比较。
你的图完美地说明了屏障是如何工作的。七个方块已经发送到一个并发队列中,四个没有障碍物(图中的方块1到4),一个障碍物(图中褐色的“障碍块”),然后再没有障碍物的两个方块图中的块5和6)。
正如你所看到的,前四个并发运行,但障碍块将不会运行,直到前四个完成。直到“障碍物”完成后,最后两个才会开始。
与此相比,一个串行队列,在没有任务可以同时运行:
如果每块分派给并发队列用屏障布控,那么你是对的,那这将等同于使用串行队列。但是,只有当您将屏障调度块与并发队列上的非屏障调度块组合起来时,屏障才能发挥作用。所以,当你想享受并发行为时,不要使用障碍。但是,对于并发队列中的单个块需要类似串行的行为,请使用屏障。
一个例子是,你可能会派出10个没有障碍的街区,但随后添加一个障碍物的第11个街区。因此,前10名可以相互并行运行,但是11名只会在前10名完成(实现“完成处理程序”行为)时开始。
或者正如rmaddy所说(+1),屏障的另一个常见用途是您访问某个共享资源的位置,您将允许其允许并发读取(无障碍),但必须强制执行同步写入(有障碍)。在这种情况下,您经常使用dispatch_sync
作为读取,dispatch_barrier_async
作为写入使用。