GCD死锁分析

首先清楚一点就是dispatch_sync程序需等待这个结果才执行下一步,dispatch_async无需等待结果继续执行下一步。

//注:这里的任务不要单纯看作是一个简单的log输出,也可以是一个复杂的操作。

简单异步操作

dispatch_async(dispatch_get_global_queue(0, 0), ^{

        NSLog(@"任务1");

        dispatch_async(dispatch_get_main_queue(), ^{

            NSLog(@"任务2");

        });

        NSLog(@"任务3");

    });

    NSLog(@"任务4");

//任务1、4随机输出

//任务3和任务1在一个队列,所以任务3在任务1后面输出

//任务2加入了主队列,添加在主队列最后面所以在任务4后面输出

最简单的死锁

dispatch_sync(dispatch_get_main_queue(), ^{

        NSLog(@"任务1");

});

NSLog(@"任务2");

//死锁 无输出。因为任务1加入了主队列最后面,等待任务2完成;而这时因为dispatch_sync所以任务2又在等待任务1完成所以就造成了死锁

dispatch_async(dispatch_get_global_queue(0, 0), ^{

        NSLog(@"任务1");

        dispatch_sync(dispatch_get_main_queue(), ^{

            NSLog(@"任务2");

        });

        NSLog(@"任务3");

    });

    NSLog(@"任务4");

//任务1、4随机输出

//因为dispatch_sync 任务3等待任务2完成,又因为任务2加入的是主队列,所以任务2等待任务4完成。所以执行顺序是任务4->任务2->任务3

dispatch_queue_t serialQueue= dispatch_queue_create("串行队列", DISPATCH_QUEUE_SERIAL);

    dispatch_async(serialQueue, ^{

        NSLog(@"任务1");

        dispatch_sync(serialQueue, ^{

            NSLog(@"任务2");

        });

        NSLog(@"任务3");

    });

    NSLog(@"任务4");

//任务1、4随机输出

//死锁 任务2和任务3不执行。原因:因为serialQueue是串行队列,所以同步时把任务2添加到任务3后面,又因为同步任务3等待任务2完成,所以就造成了死锁。

注:如果serialQueue是并发队列就不会造成死锁,因为并发队列并不会把任务2添加到任务3后面。还有值得注意的是dispatch_get_global_queue是并发队列,所以平时一直用的这个也没遇到过死锁吧。

这些都是本人对线程的一些理解,如有错误请指正。

你可能感兴趣的:(GCD死锁分析)