美文网首页
死锁问题

死锁问题

作者: SpursGo | 来源:发表于2017-11-15 13:57 被阅读22次

    判断是否死锁 终极方法是判断
    死锁问题产生的根源是dispatch_sync 是否是发生在当前dispatch_sync代码上下文是否是同一个线程
    也就是dispatch_sync 阻塞的是否是dispatch_sync代码上下文所在的线程
    比如当前我代码执行所在的是A线程,然后我做同步A现成操作 必定会死锁
    但是如果我在A线程中 做同步B线程操作是不会造成死锁的

    第一种情况


    image.png

    首先任务1 实在主线程中执行的 我同步操作 dispatch_get_main_quene()获取到的是一个主队列,主队列有个特性就是 一定会执行在主线程中,这样我阻塞的就是主线程。这样就死锁了。

    image.png

    第二种情况 首先有个概念 dispatch_get_global_quene 或者是 dispatch_quene_create来创建的队列 都是有特定的线程去做执行操作


    image.png

    也就是说肯定不是在主线程中执行的
    再分析一下上面的代码,任务1是在主线程中执行的。任务3也是主线程。但是任务2在一个独立的线程去执行,也就是阻塞的是一个分支线程,这样就不会产生阻塞。

    image.png

    再来分析一下 上面这种情况 async是不会产生死锁的。然后1 跟 5是可以正常输出的。不过由于是异步的 所以2跟5的输出顺序是不一定的。注意:假设quene所在的线程是A,任务3处 做的同步操作 就是阻塞的线程A,这样就死锁了。

    image.png

    这种情况 也是同样的逻辑思路
    任务1是在主线程中执行的,1 跟 5是可以正常执行的。2也可以正常输出。由于在任务2处是在一个独立的线程,这时候再去同步住队列所在的主线程,这样不会出现问题 因为同步操作内的block跟 同步操作所在的上下文是不在同一个线程中的

    相关文章

      网友评论

          本文标题:死锁问题

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