美文网首页
dispatch_barrier_async栅栏函数实现多线程异

dispatch_barrier_async栅栏函数实现多线程异

作者: Jean_Lina | 来源:发表于2020-07-06 10:37 被阅读0次
    • dispatch_barrier_async函数会等待栅栏函数前边追加到并发队列中的任务全部执行完毕之后,再将指定的任务追加到栅栏函数的并发队列中。然后在dispatch_barrier_async函数追加的任务执行完毕之后,并发队列才恢复为一般动作,接着追加任务到栅栏函数后的并发队列并开始执行。
    • 使用栅栏函数使用自己创建的并发队列,不要使用系统提供的全局并发队列
    #pragma mark 栅栏函数
    - (void)gcd_dispatch_barrier {
        NSLog(@"dispatch_barrier --- begin");
        dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            //追加任务1
            NSLog(@"追加任务1");
            for (int i = 0; i < 2; ++i) {
                //模拟耗时操作
                [NSThread sleepForTimeInterval:2];
                //打印当前线程
                NSLog(@"1---%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            //追加任务2
            NSLog(@"追加任务2");
            for (int i = 0; i < 2; ++i) {
                //模拟耗时操作
                [NSThread sleepForTimeInterval:2];
                //打印当前线程
                NSLog(@"2---%@",[NSThread currentThread]);
            }
        });
        dispatch_barrier_async(queue, ^{
            //追加栅栏函数任务
            NSLog(@"追加栅栏函数任务");
            for (int i = 0; i < 2; ++i) {
                //模拟耗时操作
                [NSThread sleepForTimeInterval:2];
                //打印当前线程
                NSLog(@"barrier---%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            //追加任务3
            NSLog(@"追加任务3");
            for (int i = 0; i < 2; ++i) {
                //模拟耗时操作
                [NSThread sleepForTimeInterval:2];
                //打印当前线程
                NSLog(@"3---%@",[NSThread currentThread]);
            }
        });
        dispatch_async(queue, ^{
            //追加任务4
            NSLog(@"追加任务4");
            for (int i = 0; i < 2; ++i) {
                //模拟耗时操作
                [NSThread sleepForTimeInterval:2];
                //打印当前线程
                NSLog(@"4---%@",[NSThread currentThread]);
            }
        });
        //不需要等待,直接执行
        NSLog(@"dispatch_barrier --- end");
    }
    
    

    在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作。


    屏幕快照 2020-07-06 上午11.27.58.png

    相关文章

      网友评论

          本文标题:dispatch_barrier_async栅栏函数实现多线程异

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