美文网首页iOS-多线程
关于主线程执行同步任务造成死锁的思考

关于主线程执行同步任务造成死锁的思考

作者: 本帅不良 | 来源:发表于2020-07-03 18:41 被阅读0次

经典问题重现

-(void)test2{
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"线程:%@",[NSThread currentThread]);
    });
    
}
bug 粘贴 主线程+同步造成死锁
要想明白,为什么造成死锁,首先要搞懂主线程是干嘛的

主线程程序运行的主线,即:所有的代码都是在主线程中执行的。

明白这一点,我们就可以重现这个 bug 了
/*复现*/
-(void)test3{
    NSLog(@"线程0:%@",[NSThread currentThread]);
    //1
    dispatch_queue_t queue = dispatch_queue_create("hello", DISPATCH_QUEUE_SERIAL);
    //2
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"线程1:%@",[NSThread currentThread]);
        //3
        dispatch_sync(queue, ^{
            NSLog(@"线程1:%@",[NSThread currentThread]);
            //4
            dispatch_sync(queue, ^{
                NSLog(@"2");
            });
        });
            
    });
}
结果 复现

如下:

代码解读
1、创建一个名为“hello”的串行队列。
2、在全局队列(全局队列是一个并行队列)开启一个异步任务。目的是开启一个新的线程,在这个新的线程中模拟主线程遇到的死锁困境。
3、此时我们进入了一个新的线程,即我们模拟的主线程。在这个线程中,我们在一个串行队列中执行了一个同步操作。这个同步任务类似我们的 test3方法,这个名为 “hello” 的串行队列类似我们的主线程队列。
4、我们在这个 “hello”队列中又加入了一个新任务,新任务需要里面执行,但 3 中的任务还未结束,便形成了相互等待的状态,即为死锁。

我们可以看到两次的报错相同,证明我们的复现没有问题。

为进一步验证我们的结论我们做以下思考

同步+主线程会造成死锁,同步加串行确不会 同步+串行

我们再次复现,只需要稍微改下代码


复现
总结

主线程+同步造成死锁,是因为在串行队列中,某个任务还未结束,即开始新的任务,造成的。

相关文章

  • 关于主线程执行同步任务造成死锁的思考

    经典问题重现 bug 粘贴主线程+同步造成死锁 要想明白,为什么造成死锁,首先要搞懂主线程是干嘛的 主线程程序运行...

  • iOS笔记-多线程

    同步函数&串行队列 不会开启线程,在当前线程执行任务 任务串行执行,任务一个接着一个 会产生堵塞(死锁,崩溃) 主...

  • GCD分析(中)

    同步函数死锁 死锁现象 主线程因为同步函数的原因等着先执⾏任务 主队列等着主线程的任务执⾏完毕再执⾏⾃⼰的任务 主...

  • 死锁gcd

    串行队列中添加同步会造成死锁,互相等待同步任务执行完才能执行下一个 全局的并行队列不会死锁

  • GCD学习总结

    串行同步会造成死锁 执行顺序 :1 5 2 4 3 异步不阻塞线程

  • GCD的相关使用

    一、同步执行 + 主队列 运行结果: 线程死锁。为什么呢?- (void)syncMain {} ----> 任务...

  • GCD死锁情况

    造成死锁的情况分析 第一种是:主队列同步任务很容易造成死锁,因为主队列是在主线程空闲时才会调度队列中的任务在主线程...

  • 死锁

    死锁场景: 任务互相等待 不正确的加锁 任务等待 先看区别: 同步/异步同步指不开启新线程,在当前线程等待执行任务...

  • 关于向主线程添加同步任务造成死锁的思考

    有这样一个例子,即在主线程开启同步任务死锁的例子: 关于这个例子如何会死锁,网上也有很详细的解释。不过可能对于某些...

  • GCD死锁的理解

    以上代码会造成死锁,原因是viewDidLoad函数会在主线程执行,当主线程中有任务在执行时,主队列内的任务会被阻...

网友评论

    本文标题:关于主线程执行同步任务造成死锁的思考

    本文链接:https://www.haomeiwen.com/subject/wgqeqktx.html