dispatch_barrier_sync与dispatch_barrier_async

dispatch_barrier_sync 与 dispatch_barrier_async 都是栅栏函数,拦着直至之前的任务执行完,再执行后面的。

注意

函数里面的参数queue 需是自己创建的并行队列,不能是串行,也不能是dispatch_get_global_queue获得的。

dispatch_queue_t que = dispatch_queue_create("myque", DISPATCH_QUEUE_CONCURRENT);

看效果

dispatch_barrier_async

- (void)testBary {
    dispatch_queue_t que = dispatch_queue_create("myque", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(que, ^{
        NSLog(@"执行1");
    });
    dispatch_async(que, ^{
        NSLog(@"执行2");
    });
    
    dispatch_barrier_async(que, ^{
        NSLog(@"执行4");
    });
    
    //dispatch_barrier_async不会阻碍当前线程的往下执行,所以5被提前执行了
    NSLog(@"执行5");
    
    dispatch_async(que, ^{
        NSLog(@"执行6");
    });
}

执行结果:(”执行5“在前面就执行了)

2022-09-01 22:57:35.075352+0800 asnkjfhew9f[5782:276908] 执行1
2022-09-01 22:57:35.075352+0800 asnkjfhew9f[5782:276793] 执行5
2022-09-01 22:57:35.075400+0800 asnkjfhew9f[5782:276903] 执行2
2022-09-01 22:57:35.075600+0800 asnkjfhew9f[5782:276903] 执行4
2022-09-01 22:57:35.075742+0800 asnkjfhew9f[5782:276903] 执行6

dispatch_barrier_sync

- (void)testBary {
    dispatch_queue_t que = dispatch_queue_create("myque", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(que, ^{
        NSLog(@"执行1");
    });
    dispatch_async(que, ^{
        NSLog(@"执行2");
    });
    
    dispatch_barrier_sync(que, ^{
        NSLog(@"完事了,到我执行了3");
    });
    
    //dispatch_barrier_sync会阻碍当前线程的往下执行,所以5不会提前执行
    NSLog(@"执行5");
    
    dispatch_async(que, ^{
        NSLog(@"执行6");
    });
}

执行结果:

2022-09-01 23:05:11.200965+0800 asnkjfhew9f[5876:282090] 执行1
2022-09-01 23:05:11.200989+0800 asnkjfhew9f[5876:282095] 执行2
2022-09-01 23:05:11.201289+0800 asnkjfhew9f[5876:282022] 执行3
2022-09-01 23:05:11.201424+0800 asnkjfhew9f[5876:282022] 执行5
2022-09-01 23:05:11.201584+0800 asnkjfhew9f[5876:282090] 执行6
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容