GCD死锁 多线程

   NSLog(@"1");
    dispatch_sync(dispatch_get_main_queue(), ^{ // sync同步 main串行
        // 同步,异步--线程 同步-主线程
        // main_queue global_queue 串行队列,并发队列
        // 先进先出 3先进的,2后进的,应该先走外面的,但是同步要求
        // 先进先出,任务3先,任务2最后加入队列的,先进先出,等任务3执行,但是任务2是同步任务,
        NSLog(@"2");
    });
    NSLog(@"3");

GCD:把任务添加到队列queue, 指定执行任务的函数(写在block里面)

sync会阻塞(必须按顺序执行)线程 同步

async异步,开线程

Q:上面代码输出结果是什么?

A:1

解释:主线程有3个任务:1,同步任务(主队列),任务3. 显然先输出1,任务2被添加到了主队列,任务2是最后添加的,根据GCD先进先出原则,应该先执行任务3然后执行任务2,但是sync同步阻塞线程,同步要求必须执行完Block内部的任务才能执行之后的任务,即必须先执行任务2然后再执行任务3,这样就造成了死循环,即死锁 deadLock

参考:http://www.superqq.com/blog/2015/10/16/five-case-know-gcd/

2021,9,14更新图片:

主队列是串行队列,先进先出,要求先3再2

同步线程要求 先2再3;  冲突了


2018、6、26更新:

主线程 添加任务的顺序是1,3,同步任务2,

根据先进先出原则,同步任务2需要执行完任务3再执行       2等待3

但任务2是同步任务,所以任务3需要任务2执行完毕再执行  3等待2

所以2,3任务互相等待,死锁了

总结:同步,串行可能死锁

https://hit-alibaba.github.io/interview/iOS/Cocoa-Touch/Multithreading.html

从这个例子可以看出,GCD设置线程间的依赖关系就会嵌套,嵌套很可能会出现死锁,所以为了方便的控制依赖的话,最好使用NSOperation

NSLog(@"1"); // 任务1
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    NSLog(@"2"); // 任务2
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"3"); // 任务3
     sleep(2); }); NSLog(@"4"); // 任务4 }); NSLog(@"5"); // 任务5

 1,5,2,3,4

5,2顺序不定

3阻塞4的执行,必须等3执行完才能执行4

原文地址:https://www.cnblogs.com/tufei7/p/6044384.html