美文网首页2017技术笔记
2017笔记——栅栏函数

2017笔记——栅栏函数

作者: 满庭花醉三千客 | 来源:发表于2018-07-27 16:51 被阅读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

    加油~

    相关文章

      网友评论

        本文标题:2017笔记——栅栏函数

        本文链接:https://www.haomeiwen.com/subject/hnegmftx.html