2017笔记——栅栏函数
2018-07-27 本文已影响37人
满庭花醉三千客
问题情景:
原先有几个并行执行的操作:1,2,3,4,5,6
如果我想要在1,2,3执行完毕后,执行A操作,然后再执行4,5,6该怎么办呢?
此时,栅栏函数就站出来了。
先使用dispatch_barrier_sync函数试试水:
![](https://img.haomeiwen.com/i711728/a3dd530677702cc7.png)
结果:
![](https://img.haomeiwen.com/i711728/0ade4d60d5671e4a.png)
此时,操作1,2,3执行完毕后(并发执行,请忽略顺序),开始调用barrier操作。然后是4,5,6操作。完全满足要求。
然后我们再来试试dispatch_barrier_async:
![](https://img.haomeiwen.com/i711728/605e54a97dffe54e.png)
调用的结果:
![](https://img.haomeiwen.com/i711728/2c8c57b26bbd2102.png)
dispatch_barrier_sync与dispatch_barrier_async的共同点:
都会等待在它前面插入队列的任务(这里就是1,2,3)先执行完。
都会等待他们自己的任务(barrier operation)执行完之后再执行后面的任务(4,5,6)。
dispatch_barrier_sync与dispatch_barrier_async的不同点:
将任务插入到queue的时候,dispatch_barrier_sync需要等待自己的任务(barrier operation)执行完毕后,才会插入后面的任务(4,5,6),然后执行后面的任务。
dispatch_barrier_async将自己的任务插入到queue之后,不会等待自己的任务(barrier operation)执行结果,它会继续插入后面的任务。
所以dispatch_barrier_async的特性:
在插入队列的时候是异步的,在任务真正执行的过程中是串行的。
dispatch_barrier_sync的特性:
在插入队列的时候是串行的,在任务真正执行的过程中也是串行的。
一图解释之:
![](https://img.haomeiwen.com/i711728/b36599a372f18d96.png)
加油~