关于GCD的那些事

一,死锁

任务1 先加入主队列 并且已经开始执行 然后打印出1

  NSLog(@"任务1========%@",[NSThread currentThread]);

这时任务2被下面这个函数也加入到主队列 并且同步执行

系统就会觉得同步执行,不开新线程了

任务2就要等block函数执行完成,不然不返回 主队列是串行的,要等任务1完成才能轮到任务2

这是规矩 任务2是任务1的内部函数  必须等到任务1执行完才执行下一个任务,就造成任务1等任务2完成,任务2等任务1完成  从未造成 死锁

 dispatch_sync(dispatch_get_main_queue(), ^{//直接蹦在这

NSLog(@"任务2========%@",[NSThread currentThread]);

 });

 NSLog(@"3========%@",[NSThread currentThread]);

下面代码正常执行了,并且是顺序执行的,任务1在主队列中,但是任务2加入到了全局队列,这时候,任务1和任务2没有队列的约束,所以任务1就先执行喽,执行完毕之后函数返回,任务2接着执行。

 NSLog(@"任务1========%@",[NSThread currentThread]);

    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        NSLog(@"任务 2========%@",[NSThread currentThread]);

    });

    NSLog(@"任务3========%@",[NSThread currentThread]);

原文地址:https://www.cnblogs.com/liaolijun/p/7902955.html