dispatch_barrier_async

作者: 踏云小子 | 来源:发表于2017-06-01 23:42 被阅读40次

有啥用

在并行队列中,为了保持某些任务的顺序,需要等待一些任务完成后才能继续进行,使用 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 的作用一模一样。

相关文章

网友评论

    本文标题:dispatch_barrier_async

    本文链接:https://www.haomeiwen.com/subject/ildyfxtx.html