GCD (1)

作者: 老猫_2017 | 来源:发表于2020-01-10 20:26 被阅读0次

    dispatch_async 与 dispatch_sync 到区别

    // 将block 提交到 queueA 上执行,提交到 queueA之后,继续往下执行,不等等block执行完毕,强调提交之后继续往下执行,执行,还是在当前线程进行
    dispatch_async(queueA, ^{
        //queueA 线程进行执行
    });
    
    // 除非queueA 是dispatch_get_main or target 是 dispatch_get_main, 否则就在当前线程进行执行,做为一个优化操作。直到block 执行完毕之后,才会顺序执行
    dispatch_sync(queueA, ^{
        //当前线程进行执行
    });
    
    

    看如下代码,运行如何

    dispatch_queue_t queue3 = dispatch_queue_create("t3.0", DISPATCH_QUEUE_CONCURRENT);
    NSLog(@"0 %@", NSThread.currentThread);
    dispatch_sync(queue3, ^{
        NSLog(@"1 %@", NSThread.currentThread);
        dispatch_sync(queue3, ^{
            NSLog(@"2 %@", NSThread.currentThread);
        });
        NSLog(@"3 %@", NSThread.currentThread);
    });
    
    NSLog(@"4 %@", NSThread.currentThread);
    
    

    输出结果是 0,1,2,3,4, sync 为何没有 死锁,因为是queue3 是并发线程,会有多个执行路径,所以不会死锁,输出的顺序是,提交点的顺序,所以是 按顺序输出, 对应的线程,都是 主线程,这个是线程优化,因为他们跑在主线程中

        dispatch_queue_t queue1 = dispatch_queue_create("t1.0", DISPATCH_QUEUE_SERIAL);
        dispatch_queue_t queue3 = dispatch_queue_create("t3.0", DISPATCH_QUEUE_CONCURRENT);
    
        NSLog(@"0 %@", NSThread.currentThread);
        dispatch_async(queue1, ^{
            dispatch_sync(queue3, ^{
                NSLog(@"1 %@", NSThread.currentThread);
                dispatch_sync(queue3, ^{
                    NSLog(@"2 %@", NSThread.currentThread);
                });
                NSLog(@"3 %@", NSThread.currentThread);
            });
        });
        NSLog(@"4 %@", NSThread.currentThread);
    
    

    输出结果,同上,只是队列是 queue1 的线程队列中

        dispatch_queue_t queue1 = dispatch_queue_create("t1.0", DISPATCH_QUEUE_SERIAL);
        NSLog(@"0 %@", NSThread.currentThread);
        dispatch_sync(queue1, ^{
            NSLog(@"1 %@", NSThread.currentThread);
            dispatch_sync(queue1, ^{
                NSLog(@"2 %@", NSThread.currentThread);
            });
            NSLog(@"3 %@", NSThread.currentThread);
        });
        NSLog(@"4 %@", NSThread.currentThread);
    
    

    输出 0,1, 然后卡死,同步到主线程去

        dispatch_queue_t queue1 = dispatch_queue_create("t1.0", DISPATCH_QUEUE_SERIAL);
        dispatch_queue_t queue3 = dispatch_queue_create("t3.0", DISPATCH_QUEUE_CONCURRENT);
    
        NSLog(@"0 %@", NSThread.currentThread);
        dispatch_async(queue1, ^{
            dispatch_sync(queue2, ^{
                NSLog(@"1 %@", NSThread.currentThread);
                dispatch_sync(dispatch_get_main_queue(), ^{
                    NSLog(@"2 %@", NSThread.currentThread);
                });
                NSLog(@"3 %@", NSThread.currentThread);
            });
        });
        NSLog(@"4 %@", NSThread.currentThread);
    
    

    输出是否会死锁呢?不会,输出顺序 0,4,1,2,3 , dispatch_sync(dispatch_get_main_queue() 会真正的切换到主队列中去的。

        dispatch_queue_t queue = dispatch_queue_create("并行", DISPATCH_QUEUE_CONCURRENT);
        dispatch_sync(queue, ^{
            dispatch_async(queue, ^{
                NSLog(@"任务2");
            });
            dispatch_async(queue, ^{
                NSLog(@"任务3");
            });
            dispatch_async(queue, ^{
                NSLog(@"任务4");
            });
            dispatch_async(queue, ^{
                NSLog(@"任务5");
            });
            dispatch_barrier_async(queue, ^{
                NSLog(@"任务1000");
            });
            dispatch_async(queue, ^{
                NSLog(@"任务6");
            });
            dispatch_async(queue, ^{
                NSLog(@"任务7");
            });
            //睡眠2秒
    //        [NSThread sleepForTimeInterval:2];
            NSLog(@"任务1");
        });
    

    它的输出结果是,1,2,3,4,5 无顺序在 1000之前, 1000,之后 6,7无顺序,

    相关文章

      网友评论

          本文标题:GCD (1)

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