dispatch_barrier_sync与dispatch_barrier_async的区别

同步栅栏和异步栅栏都能够阻塞队列上的任务,但是最大的区别在于能否阻塞当前线程。

异步栅栏

dispatch_queue_t queue = dispatch_queue_create("TestQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
    printf("1\n");
});
printf("2\n");
dispatch_barrier_async(queue, ^{
    printf("3\n");
});
printf("4\n");
dispatch_async(queue, ^{
    printf("5\n");
});
printf("~~~\n");

打印结果(运行了两次)

2 1 4 ~~~ 3 5
2 4 ~~~ 1 3 5

(首先,我这里写的是一个简单的Demo,当前线程是主线程)分析,由于是异步栅栏,那么他就没有阻塞当前线程的执行.而且咱们把任务都放到一个并发线程上去执行的(而且是异步任务).这个栅栏打印的3肯定不会阻拦当前线程的2和4.也就是说2.4的顺序是固定的.先执行2.然后执行4.然后对于栅栏3来讲.因为拦住了1.那么1和5相对于3的位置也是确定的.1在3前面打印.5在3后面打印.其余1可能出现在2前面也可能出现在2后面的分析就不做了.毕竟之前讲同步任务异步任务的时候讲了

同步栅栏

dispatch_queue_t queue = dispatch_queue_create("TestQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
    printf("1\n");
});
printf("2\n");
dispatch_barrier_sync(queue, ^{
    printf("3\n");
});
printf("4\n");
dispatch_async(queue, ^{
    printf("5\n");
});
printf("~~~\n");

打印结果(运行了两次)

2 1 3 4 ~~~ 5

2 1 3 4 ~~~ 5

可以看出来.同步栅栏阻塞了当前线程.3与之前的1.2未打印的话.4就不会走.

补充

dispatch_queue_t queue = dispatch_queue_create("TestQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
    printf("1\n");
    dispatch_async(queue, ^{
        [NSThread sleepForTimeInterval:10];
        printf("1--\n");
    });
});
printf("2\n");
dispatch_barrier_sync(queue, ^{
    printf("3\n");
});
printf("4\n");
dispatch_async(queue, ^{
    printf("5\n");
});
printf("~~~\n");

输出结果

2 1 3 4 ~~~ 5 1 --

和调度组的async和sync函数一样不能阻塞任务里面新开异步任务。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容