dispatch_barrier_async和dispatch_barrier_sync

dispatch_barrier_async和dispatch_barrier_sync是 GCD 中的两个方法。是不是和dispatch_async及dispatch_sync长得很像,就是多了一个barrier(译:栅栏)。
没错,除了有dispatch_async或dispatch_sync的作用外(是否阻塞当前线程),还有“栅栏”的效果。
意思就是,在该队列,以他们为界,待前面任务执行完成,再把自己内部的任务执行完,才会执行后面的任务。

知道和dispatch_async及dispatch_sync对应,就应该想到:
dispatch_barrier_async不阻塞当前线程,dispatch_barrier_async里面的任务异步执行。
dispatch_barrier_sync会阻塞当前线程,dispatch_barrier_sync里面的任务同步执行。
例: dispatch_barrier_async

dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQ", DISPATCH_QUEUE_CONCURRENT);

    //以下任务
    dispatch_async(concurrentQueue, ^{ NSLog(@"任务1"); });
    dispatch_async(concurrentQueue, ^{ NSLog(@"任务2"); });
    dispatch_async(concurrentQueue, ^{ NSLog(@"任务3"); });
    dispatch_barrier_async(concurrentQueue, ^{
        sleep(1);
        NSLog(@"I am barrier");
    });
    NSLog(@"当前线程");
    dispatch_async(concurrentQueue, ^{ NSLog(@"任务4"); });
    dispatch_async(concurrentQueue, ^{ NSLog(@"任务5"); });

打印:
这里写图片描述

例: dispatch_barrier_sync

dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQ", DISPATCH_QUEUE_CONCURRENT);

    //以下任务
    dispatch_async(concurrentQueue, ^{ NSLog(@"任务1"); });
    dispatch_async(concurrentQueue, ^{ NSLog(@"任务2"); });
    dispatch_async(concurrentQueue, ^{ NSLog(@"任务3"); });
    dispatch_barrier_sync(concurrentQueue, ^{
        sleep(1);
        NSLog(@"I am barrier");
    });
    NSLog(@"当前线程");
    dispatch_async(concurrentQueue, ^{ NSLog(@"任务4"); });
    dispatch_async(concurrentQueue, ^{ NSLog(@"任务5"); });

打印:
这里写图片描述

注:
1.任务1,2,3是无序的。任务4,5是无序的。
2.I am barrier是任务1,2,3与任务4,5的分界线,总是等任务1,2,3执行完,然后I am barrier执行完,才会执行任务4,5。
3.dispatch_barrier_async会阻塞,dispatch_barrier_sync不会阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值