iOS 同步、异步、串行、并行探索

  • 对同步、异步、串行、并行的执行顺序,之前总是模棱两可,今天写个Demo测试一下,废话不多说(其实也不会说),直接上测试代码
一、首先定义两个方法,一个同步执行相应代码,一个异步执行
//同步执行
- (void)syncTestWithQueue:(dispatch_queue_t)queue withBarrier:(BOOL)barrer{
    NSLog(@"1");
    dispatch_sync(queue, ^{
        NSLog(@"start 1");
        sleep(3);
        NSLog(@"end 1");
    });
    NSLog(@"2");
    dispatch_sync(queue, ^{
        NSLog(@"start 2");
        sleep(3);
        NSLog(@"end 2");
    });
    NSLog(@"3");
    dispatch_sync(queue, ^{
        NSLog(@"start 3");
        sleep(3);
        NSLog(@"end 3");
    });
    NSLog(@"4");
    dispatch_sync(queue, ^{
        NSLog(@"start 4");
        sleep(3);
        NSLog(@"end 4");
    });
    NSLog(@"5");
    
    if (barrer) {
        dispatch_barrier_sync(queue, ^{
            NSLog(@"barrier start 1");
            sleep(3);
            NSLog(@"barrier end 1");
        });
        NSLog(@"6");
        dispatch_sync(queue, ^{
            NSLog(@"start 5");
            sleep(3);
            NSLog(@"end 5");
        });
        NSLog(@"7");
    }
}

//异步执行
- (void)asyncTestWithQueue:(dispatch_queue_t)queue withBarrier:(BOOL)barrer{
    NSLog(@"1");
    dispatch_async(queue, ^{
        NSLog(@"start 1");
        sleep(3);
        NSLog(@"end 1");
    });
    NSLog(@"2");
    dispatch_async(queue, ^{
        NSLog(@"start 2");
        sleep(3);
        NSLog(@"end 2");
    });
    NSLog(@"3");
    dispatch_async(queue, ^{
        NSLog(@"start 3");
        sleep(3);
        NSLog(@"end 3");
    });
    NSLog(@"4");
    
    if (barrer) {
        dispatch_barrier_async(queue, ^{
            NSLog(@"barrier start 1");
            sleep(3);
            NSLog(@"barrier end 1");
        });
        NSLog(@"5");
        dispatch_async(queue, ^{
            NSLog(@"start 4");
            sleep(3);
            NSLog(@"end 4");
        });
        NSLog(@"6");
    }
}

二、在自行创建串行队列执行这两个方法

测试代码

    //自行创建串行队列
    dispatch_queue_t serialQueue=dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);
    //1.同步
    [self syncTestWithQueue:serialQueue withBarrier:YES];
    //2.异步
    [self asyncTestWithQueue:serialQueue withBarrier:YES];

输出结果

iOS 同步、异步、串行、并行探索_第1张图片
syncTestWithQueue: withBarrier:
iOS 同步、异步、串行、并行探索_第2张图片
asyncTestWithQueue: withBarrier:

结论:

1.同步与异步block的执行顺序都是按顺序执行的,不同的是同步会阻塞线程,异步不会
2.dispatch_barrier,执行顺序 和 dispatch_sync与dispatch_async加入的block是一样的

三、主线程串行队列

测试代码

    dispatch_queue_t mainSerialQueue=dispatch_get_main_queue();
    //1.同步
    //会阻塞,不用想了
    [self syncTestWithQueue:mainSerialQueue withBarrier:YES];
    //2.异步
    [self asyncTestWithQueue:mainSerialQueue withBarrier:YES];

输出结果

iOS 同步、异步、串行、并行探索_第3张图片
asyncTestWithQueue: withBarrier:

结论

同步会阻塞,异步和自行创建串行队列是一样的

四、自行创建并行队列

测试code

    dispatch_queue_t concurrentQueue=dispatch_queue_create("并行队列", DISPATCH_QUEUE_CONCURRENT);
    //1.同步
    [self syncTestWithQueue:concurrentQueue withBarrier:YES];
    //2.异步
    [self asyncTestWithQueue:concurrentQueue withBarrier:YES];

输出

iOS 同步、异步、串行、并行探索_第4张图片
syncTestWithQueue: withBarrier:
iOS 同步、异步、串行、并行探索_第5张图片
asyncTestWithQueue: withBarrier:

结论

1.同步:由于会阻塞线程,所以并行与串行执行顺序是一样的
2.异步:所有block都会一起执行,dispatch_barrier执行时之后加入的block,会等待barrier执行完再执行

五、全局并行队列

测试code

    dispatch_queue_t globalConcurrentQueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    //1.同步
    [self syncTestWithQueue:globalConcurrentQueue withBarrier:YES];
    //2.异步
    [self asyncTestWithQueue:globalConcurrentQueue withBarrier:YES];

输出

iOS 同步、异步、串行、并行探索_第6张图片
syncTestWithQueue: withBarrier:
iOS 同步、异步、串行、并行探索_第7张图片
asyncTestWithQueue: withBarrier:

结论

1.同步:与自行创建并发队列是一样的
2.异步:所有block都会一起执行,但是,dispatch_barrier执行时之后加入的block,不会等待barrier执行完再执行(dispatch_barrier不要用在全局并发队列里)

你可能感兴趣的:(iOS 同步、异步、串行、并行探索)