GCD 同步序列 main_queue

GCD sync serial main_queue

-(void)test1{
    dispatch_queue_t queue = dispatch_get_main_queue();
    NSLog(@"start");
    dispatch_sync(queue, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
}

-(void)test2{
    dispatch_queue_t queue = dispatch_queue_create("com.yaoye.serial", DISPATCH_QUEUE_SERIAL);
    NSLog(@"start");
    dispatch_sync(queue, ^{
        NSLog(@"%@",[NSThread currentThread]);
    });
}

test1和test2在主线程中执行

测试 1 示例:

主线程阻塞等待同步函数,阻塞进入runloop主线程无法执行,导致死锁。

测试 2 示例:

等待同步函数的主线程阻塞,阻塞进入runloop的主线程,但没有死锁。<2016-03-14 13:55:06.730 GCD[54320:12111593] <NSThread: 0x7fef4ac08810>{number = 1, name = main}>

问题:

为什么不是test2死锁?

因为test1使用相同的主队列,而test2使用不同的队列