美文网首页iOS_Skill_Collect
iOS 同步、异步、串行、并行探索

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

作者: MangK | 来源:发表于2016-08-28 20:46 被阅读406次
    • 对同步、异步、串行、并行的执行顺序,之前总是模棱两可,今天写个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];
    

    输出结果

    syncTestWithQueue: withBarrier: 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];
    

    输出结果

    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];
    

    输出

    syncTestWithQueue: withBarrier: 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];
    

    输出

    syncTestWithQueue: withBarrier: asyncTestWithQueue: withBarrier:

    结论

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

    相关文章

      网友评论

        本文标题:iOS 同步、异步、串行、并行探索

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