2017技术笔记

2017笔记——栅栏函数

2018-07-27  本文已影响37人  满庭花醉三千客

问题情景:

原先有几个并行执行的操作:1,2,3,4,5,6

如果我想要在1,2,3执行完毕后,执行A操作,然后再执行4,5,6该怎么办呢?

此时,栅栏函数就站出来了。

先使用dispatch_barrier_sync函数试试水:

屏幕快照 2017-03-10 下午2.11.37.png

结果:

屏幕快照 2017-03-10 下午2.48.05.png

此时,操作1,2,3执行完毕后(并发执行,请忽略顺序),开始调用barrier操作。然后是4,5,6操作。完全满足要求。

然后我们再来试试dispatch_barrier_async:

屏幕快照 2017-03-10 下午2.55.21.png

调用的结果:

屏幕快照 2017-03-10 下午2.56.20.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的特性:

在插入队列的时候是串行的,在任务真正执行的过程中也是串行的。

一图解释之:

屏幕快照 2016-07-05 11.16.59.png

加油~

上一篇 下一篇

猜你喜欢

热点阅读