美文网首页
同步串行导致的死锁问题

同步串行导致的死锁问题

作者: 鞋底没纹易摔跤 | 来源:发表于2017-09-17 15:08 被阅读56次

GCD中同步操作dispatch_sync()中队列使用主队列会导致线程死锁,是众所周知的事情。但是是如何造成死锁的呢?如下面的主队列同步操作,运行结果是崩溃的。


主队列同步操作

主要原因是在Sync方法中的代码是在dispatch_get_main_queue()主队列中执行的,当执行到dispatch_sync()时就会把任务插入到dispatch_get_main_queue()队列后面中(FIFO原则)。sync 会等到 后面block 执行完成才返回, 而sync 现在又在 dispatch_get_main_queue() 队列中,它 是后加入的主队列的。所以 sync 想执行 block 必须等待主线程执行完成,主线程等待 sync 返回,去执行后续内容。从而造成死锁。也就是相互等待。如下图


死锁原因

ps: 主队列是GCD本身自带了一种特殊的串行队列,所有放在主队列中的任务都会在主线程上执行

相关文章

  • 2022-11-17 08多线程

    GCD 同步串行 死锁!,会导致队列引起循环等待 没有问题 同步并发 答案:12345 产生死锁 异步串行 异步并...

  • 同步串行导致的死锁问题

    GCD中同步操作dispatch_sync()中队列使用主队列会导致线程死锁,是众所周知的事情。但是是如何造成死锁...

  • GCD 死锁

    GCD死锁 同步 异步 串行 并发

  • 551,GCD的队列嵌套情况下,不同组合方式区别(面试点:一,异

    除了上边提到的『主线程』中调用『主队列』+『同步执行』会导致死锁问题。实际在使用『串行队列』的时候,也可能出现阻塞...

  • GCD

    1、同步串行队列 2、同步并行队列 3、异步串行队列 4、异步并行队列 5、死锁 主线程中创建同步串行队列 主线程...

  • iOS 面试全方位剖析 -- 多线程篇

    同步串行 先看一个头条的面试真题,下面这段代码有什么问题? 这是一个同步串行的问题,这段代码会造成程序死锁,下面分...

  • GCD死锁关键点

    产生gcd死锁的关键原因和唯一点就是: 同步嵌套向同一个串行队列增加任务,导致互相阻塞(主线程也是串行队列哦)

  • GCD 相关函数

    串行同步 串行异步 并行同步 并行异步 主队列同步 会死锁 主队列异步 异步处理耗时,回主线程刷新UI 栅栏函数 ...

  • 2021--- GCD

    gcd同步,异步,串行队列,并发队列,全局队列,主队列,以及死锁。 1、gcd队列阻塞问题[https://www...

  • GCD的串行队列同步死锁问题

    《Effective Objective-C 2.0》中“第46条:不要使用dispatch_get_curren...

网友评论

      本文标题:同步串行导致的死锁问题

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