dispatch_sync和dispatch_barrier_sync的区别

二者因为是sync提交,所以都是阻塞当前提交Block线程。
而它俩唯一的区别是:dispatch_sync并不能阻塞并行队列。

dispatch_queue_t queue = dispatch_queue_create("com.yahui.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
    dispatch_async(queue, ^{
        NSLog(@"任务二");
    });
    dispatch_async(queue, ^{
        NSLog(@"任务三");
    });
    //睡眠2秒
    [NSThread sleepForTimeInterval:2];
    NSLog(@"任务一");
});

输出结果 :

任务三
任务二
任务一

很显然,并行队列没有被sync所阻塞。
dispatch_barrier_sync可以阻塞并行队列(栅栏作用的体现):

dispatch_queue_t queue = dispatch_queue_create("com.yahui.queue", DISPATCH_QUEUE_CONCURRENT);
    dispatch_barrier_sync(queue, ^{
        dispatch_async(queue, ^{
            NSLog(@"任务二");
        });
        dispatch_async(queue, ^{
            NSLog(@"任务三");
        });
        //睡眠2秒
        [NSThread sleepForTimeInterval:2];
        NSLog(@"任务一");
    });

输出结果 :

任务一
任务二
任务三

如果上述结果看不明白请参考:dispatch_group_t和dispatch_barrier_async 同步多线程任务

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容