GCD 死锁案例分析

2017-05-06  本文已影响25人  Brucezhang1
案例一:主队列,同步线程
  NSLog(@"dispatch_queue_1");//任务一

    dispatch_sync(dispatch_get_main_queue(), ^{
    });

    NSLog(@"dispatch_queue_3");// 任务三

// 输出: dispatch_queue_1
案例二:主队列,异步线程
NSLog(@"dispatch_queue_1");//任务1
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"dispatch_queue_2");// 任务二
    });
    NSLog(@"dispatch_queue_3");// 任务三

// 输出:
dispatch_queue_1
dispatch_queue_3
dispatch_queue_2
案例三:全局队列,同步线程
NSLog(@"dispatch_queue_1");//任务1
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
          NSLog(@"dispatch_queue_2");//任务2
     });
     NSLog(@"dispatch_queue_3");// 任务3

// 输出:
dispatch_queue_1
dispatch_queue_2
dispatch_queue_3
案例四:全局队列,异步线程
NSLog(@"dispatch_queue_1");//任务1
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
          NSLog(@"dispatch_queue_2");//任务2
     });
     NSLog(@"dispatch_queue_3");// 任务3

// 输出:
dispatch_queue_1
dispatch_queue_2
dispatch_queue_3
or 
dispatch_queue_1
dispatch_queue_3
dispatch_queue_2
案例五:串行队列,异步、同步线程
dispatch_queue_t queue = dispatch_queue_create("com.gcd.serialqueue", DISPATCH_QUEUE_SERIAL);
     NSLog(@"dispatch_queue_1");//任务1    
_async(queue, ^{
        NSLog(@"dispatch_queue_2");//任务2
        dispatch_sync(queue, ^{
            NSLog(@"dispatch_queue_3");//任务3
        });
        NSLog(@"dispatch_queue_4");//任务4
    });
    NSLog(@"dispatch_queue_5");//任务5
案例六:异步线程、全局队列,同步线程,主队列
/*
     1:加入到Main Queue中的有 任务1,异步线程、全局队列,任务5
     2:加入到 Global Queue中的有 任务2,同步线程,主队列,任务4
     */
    NSLog(@"dispatch_queue_1");//任务1
    
    //  执行完任务1后,将异步线程的任务2加到Global Queue中,所以任务5不用等待,结果就是2和5的输出顺序不一定
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"dispatch_queue_2");//任务2
        // 执行完任务2,将同步线程的任务添加到主队列中,这时任务3在任务5后面。
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"dispatch_queue_3");//任务3
        });
        // 未发生阻塞,执行任务4
        NSLog(@"dispatch_queue_4");//任务4
    });
     NSLog(@"dispatch_queue_5");//任务5
上一篇 下一篇

猜你喜欢

热点阅读