dispatch_barrier_async

有啥用

在并行队列中,为了保持某些任务的顺序,需要等待一些任务完成后才能继续进行,使用 barrier 来等待之前任务完成,避免数据竞争等问题。
举个栗子,老师说原地解散,大家上个厕所,回来继续排队去公园,同学们飞奔向厕所,男孩纸因为毕竟快稀里哗啦很快回来了,女孩纸因为那个原因(你懂得)比较慢还没回来,而老师要求是女孩纸排在前面,男孩子排在后面,这时候就需要一个"栅栏"保证排队的顺序不被打乱,男孩纸就等着女生回来再一起,排队,去公园,这个"栅栏"就是dispatch_barrier_async

实战

dispatch_queue_t queue = dispatch_queue_create("will's thread", 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]);
    });

dispatch_barrier_async作用是等待1、2两个并行操作完成,才继续后面3、4并行操作

image.png

如果你去掉dispatch_barrier_async,就全乱咯

- (void)barrier{//同dispatch_queue_create函数生成的concurrent Dispatch Queue队列一起使用
    dispatch_queue_t queue = dispatch_queue_create("will's thread", 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]);
    });
}
image.png

注意点

使用 dispatch_barrier_async ,该函数只能搭配自定义并行队列 dispatch_queue_t 使用。不能使用: dispatch_get_global_queue ,否则 dispatch_barrier_async 的作用会和 dispatch_async 的作用一模一样。

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

推荐阅读更多精彩内容

  • 在访问数据库或者文件的时候,我们可以使用Serial Dispatch Queue可避免数据竞争问题,代码如下所示...
    魏雷123阅读 2,472评论 0 0
  • 需求:有4个任务{1,2,3,4},执行完前2个再执行后2个 这里我们用到栅栏函数dispatch_barrier...
    红成魔阅读 21,391评论 9 18
  • 作用 实现高效率的数据库访问和文件访问 避免数据竞争 前提条件 必须使用dispatch_queue_create...
    神的旨意阅读 2,870评论 0 1
  • 学多线程时,不注意总结老是学学忘忘,今天特地总结下。只为总结留作资料,参考了许多博客内容,如有博主不爽请留言,立马...
    thinkq阅读 1,716评论 0 1
  • 好几年没见你,不知道你消息。夜里的风雨,请你不用太急,给我这个夜归人,没带伞的灵魂,一点点侥幸。
    婷儿小鱼阅读 1,144评论 4 2