美文网首页
关于dispatch_sync的死锁

关于dispatch_sync的死锁

作者: JiangDaDaaa | 来源:发表于2020-09-07 17:30 被阅读0次

看源码的时候看到了sync的运用,故将于此有关的死锁按自己的想法理解一下

官方的解析

 Submits a workitem to a dispatch queue like dispatch_async(), however
 dispatch_sync() will not return until the workitem has finished.
 
将工作项提交到dispatch_async()这样的调度队列, 但是,dispatch_sync()在工作项完成之前不会返回。

引用一下 这篇文章的说法:

任务A要想执行完,则必须要等待dispatch_sync函数返回,
然而dispatch_sync要想返回又必须等待任务B完成,
队列又是先进先出的,所以任务B要想执行则必须等待任务A执行完成,
这就形成了相互等待,从而发生死锁.
有些人可能会想凭啥任务B就得排在任务A后面?咋就不能在任务A前面?
我现在就告诉你还真不能,前面已经说了dispatch_sync是不新开线程的,它
现在在当前线程提交一个任务B,那理所当然的任务B就得排在任务A后面.

用代码去看

    // 在主队列上,插入一个同步block块,导致死锁
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"do someting");
    });

这里其实看了挺久看不懂的,我们可以这样去想,主线程是同步单线程的.在同步线程上插入了block块,相当于如下代码:

    dispatch_queue_t serialQueue = dispatch_queue_create("com.blbl", DISPATCH_QUEUE_SERIAL);
    
    dispatch_sync(serialQueue, ^{
        NSLog(@"任务A");
        /**
         在当前队列又提交一次同步运行的block,
         导致任务A需要等待任务B返回,而任务A在任务B之前调用,
         所以任务B又需要等待任务A返回了之后才能执行
         */
        dispatch_sync(serialQueue, ^{
            NSLog(@"任务B");
        });
    });

个人比较通俗的理解方式

  1. 由于队列是先进先出的, 所以任务A先运行,所以任务A在队列前方
  2. 任务B这时候同步了一个block块进来,然后任务A就需要去等待任务B完成
  3. 由由于任务A先进来嘛,然后任务B又要等任务A完成
  4. 再通俗一点的说,任务B 插队了 任务A,却又在等任务A完成。😂😂

相关文章

  • 关于dispatch_sync死锁

    理解顺序 1、主线程有且只要一个队列,即主队列,用于UI刷新。通过这个dispatch_get_main_queu...

  • 关于dispatch_sync的死锁

    看源码的时候看到了sync的运用,故将于此有关的死锁按自己的想法理解一下 官方的解析 引用一下 这篇文章的说法: ...

  • 多线程进阶

    1.线程死锁问题 1) dispatch_sync(dispatch_get_main_queue(), ^{ ...

  • 死锁问题

    判断是否死锁 终极方法是判断死锁问题产生的根源是dispatch_sync 是否是发生在当前dispatch_s...

  • 面试题整理(一)

    1.堆和栈的区别 2.死锁问题 //死锁原因 dispatch_sync在等待block语句执行完成,而block...

  • dispatch_sync死锁问题研究

    首先,看看如下代码的输出是什么? 首先答案是会发生死锁,我们看看官方文档关于dispatch_sync的解释: S...

  • GCD2

    1. 死锁 发生死锁原因:dispatch_sync会将任务追加到队列上,等当前的任务执行完毕,再执行Block中...

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

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

  • GCD的基本语法

    //异步主线程运行,不会产生生死锁 dispatch_sync(dispatch_get_main_queue()...

  • 多线程引起死锁的几种情况及解决办法

    1.第一种情况:dispatch_sync(dispatch_get_main_queue(), ^{}引起死锁 ...

网友评论

      本文标题:关于dispatch_sync的死锁

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