美文网首页程序员
从dispatch_barrier_async和dispatch

从dispatch_barrier_async和dispatch

作者: AlwaysBlue | 来源:发表于2019-10-14 11:42 被阅读0次

    dispatch_barrier_async,需要等待前面的任务并发执行完毕,后面的任务需要等待barrier的任务执行完毕,才能开始并发执行后面的任务。
    dispatch_barrier_sync,功能同上。
    这两个barrier的不同,主要体现在阻塞当前线程上会有什么不同,而不是说阻塞那个队列中的任务会有什么不同。

    dispatch_barrier_async如下图:

    可以看出,barrier并没有阻塞到aa和bb的执行。barrier_async不会阻塞当前线程。dispatch_barrier_async会为block任务可能(如果线程池中有可用的,会直接使用)会开辟一个新线程。
    dispathc_barrier_sync运行结果如下:

    dispatch_barrier_sync是会阻塞当前线程,并且是在当前线程执行的block,不会创建新的线程。

    By the way:
    从任务执行上可以看出,dispatch_async会创建线程,也就是是GCD在使用过程中,用户是不需要去创建和管理,启动线程的,使用户专注于任务的执行。
    dispatch_sync是不会创建线程的。

    如果是串行队列,dispatch_barrier_sync:


    改为dispatch_sync,结果一样。可以得出这样的结论:
    1.在串行队列中,dispatch_barrier_sync和dispatch_barrier_async功能一样。
    2.dispatch_async会创建新的线程,如果是串行队列,那么只开启一个线程。任务按照加入的顺序执行。
    3.dispatch_sync不会创建新的线程,按照上述的例子,sync添加在串行队列中的,都是在主线程中执行的。
    4.串行队列中的任务不一定在同一个线程中。
    顺手,我们看一下在串行队列上,执行sync和async:

    在这个串行队列中执行的任务,前几个通过sync的是在main线程上执行的,后面的则是在子线程中执行的。sync不会创建线程,async会创建,但是在串行队列中,async只会创建一个队列。

    如果是串行队列,dispatch_barrier_async:

    都是在同一个线程中,dispatch_async和dispatch_barrier_async效果一样。

    相关文章

      网友评论

        本文标题:从dispatch_barrier_async和dispatch

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