GCD栅栏

作者: 一个半吊子工程师 | 来源:发表于2020-10-16 15:21 被阅读0次

GCD栅栏

//GCD是基于C的,所有barrier是函数
//GCD中的barrier函数有两种形式

//第一种 实质上还是异步函数

dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

//第二种 实质上还是同步函数

dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block);
//无论barrier函数的async还是sync,文档中都是要求和自定义的并发队列配合使用
/* @discussion
 * Submits a function to a dispatch queue like dispatch_async_f(), but marks
 * that function as a barrier (relevant only on DISPATCH_QUEUE_CONCURRENT
 * queues).
 */

一个dispatch barrier 允许在一个并发队列中创建一个同步点。当在并发队列中遇到一个barrier, 他会延迟执行barrier的block,等待所有在barrier之前提交的blocks执行结束。 这时,barrier block自己开始执行。 之后, 队列继续正常的执行操作。

调用这个函数总是在barrier block被提交之后立即返回,不会等到block被执行。当barrier block到并发队列的最前端,他不会立即执行。相反,队列会等到所有当前正在执行的blocks结束执行。到这时,barrier才开始自己执行。所有在barrier block之后提交的blocks会等到barrier block结束之后才执行。

这里指定的并发队列应该是自己通过dispatch_queue_create函数创建的。如果你传的是一个串行队列或者全局并发队列,这个函数等同于dispatch_async函数。

当任务需要异步进行,但是这些任务需要分成两组来执行,第一组完成之后才能进行第二组的操作。这时候就用了到GCD的栅栏方法dispatch_barrier_async

- (void)barrier
{
  //同dispatch_queue_create函数生成的concurrent Dispatch Queue队列一起使用
    dispatch_queue_t queue = dispatch_queue_create("12312312", DISPATCH_QUEUE_CONCURRENT);
    
    dispatch_async(queue, ^{
        NSLog(@"----1-----%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"----2-----%@", [NSThread currentThread]);
    });
    
    dispatch_barrier_async(queue, ^{
        NSLog(@"----barrier-----%@", [NSThread currentThread]);
    });
    
    dispatch_async(queue, ^{
        NSLog(@"----3-----%@", [NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"----4-----%@", [NSThread currentThread]);
    });
}

输出结果:1 2 --> barrier -->3 4  其中12 与 34 由于并行处理先后顺序不定

开启了多条线程,所有任务都是并发异步进行。但是第一组完成之后,才会进行第二组的操作。

相关文章

  • iOS-GCD常用函数和栅栏函数

    GCD常用函数 GCD栅栏函数

  • GCD栅栏

    需求: 有4个任务, 需要开启多条线程去执行。 有一个特殊任务0, 需要在1,2任务执行完后, 再执行3, 4任务...

  • GCD栅栏

    GCD栅栏 //GCD是基于C的,所有barrier是函数//GCD中的barrier函数有两种形式 //第一种 ...

  • GCD栅栏函数, 快速迭代和调度组的使用

    今天介绍几个比较重要的GCD函数: GCD栅栏函数: 同步栅栏函数: 会发生阻塞 异步栅栏函数: 不会发生阻塞 栅...

  • GCD-线程栅栏

    GCD的线程栅栏分为同步栅栏(dispatch_barrier_sync)和异步栅栏(dispatch_barri...

  • GCD

    1,GCD 栅栏方法:dispatch_barrier_async 2,GCD 延时执行方法:dispatch_a...

  • GCD栅栏函数

    // 栅栏函数在下面方法是不生效的. // dispatch_queue_t queen = dispatch_...

  • gcd栅栏函数

    栅栏函数之前的和之后的会分开执行,dispatch_barrier_async(<#dispatch_queue_...

  • GCD栅栏函数

    dispatch_barrier_async dispatch_barrier_sy...

  • gcd 栅栏函数

    1、当开发中,需要开启多个任务,同时需要控制前几个任务和后几个任务的顺序,该怎么办? 2、可以使用GCD的栅栏函数...

网友评论

      本文标题:GCD栅栏

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