美文网首页
dispatch_sync到底为什么死锁

dispatch_sync到底为什么死锁

作者: program袁 | 来源:发表于2016-03-11 15:30 被阅读372次

之前看面试题知道下面代码会死锁,网上说是因为相互等待,等等,总觉得难以理解

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"死锁了");

});

经过一下午的仔细研究,算是有点收获,下面分享给大家,不对的地方欢迎指正

一:首先介绍下基本概念

队列:用于存放任务。一共有两种队列,串行队列并行队列

同步(sync)和异步(async)的主要区别在于会不会阻塞当前线程,直到Block中的任务执行完毕!

如果是同步(sync)操作,它会阻塞当前线程并等待Block中的任务执行完毕,然后当前线程才会继续往下运行。

如果是异步(async)操作,当前线程会直接往下执行,它不会阻塞当前线程

二:死锁

官方文档指出:dispatch_sync的当前执行队列与提交block执行的目标队列相同时将造成死锁。

Submits a block to a dispatch queue for synchronous execution. Unlike dispatch_async, this function does not return until the block has finished. Calling this function and targeting the current queue results in deadlock.

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"死锁了");

});

根据文档所说,此任务本身(整个代码)在主队列中,而要添加的任务(NSLog(@"死锁了");)也要添加到主队列,它会死锁。这是为什么呢?

假设自己为A任务,A任务所在的队列为主队列,A任务正在执行,A任务的代码是添加B任务到主队列并使B任务执行完毕,然后B任务就被添加到主队列,可是它要等待A任务执行完,才轮到它执行,A任务等待B任务,B任务又等待A任务,因此形成死锁。

为了验证观点,我试了下面的代码:

dispatch_queue_t queue =dispatch_queue_create("queue",DISPATCH_QUEUE_SERIAL);

dispatch_sync(queue, ^{

       NSLog(@"正常打印");

      dispatch_sync(queue, ^{

                 NSLog(@"死锁了");

                });

     });

NSLog(@"死锁了");

因为是同步往“queue”添加任务,可是本身又是在“queue”中执行,再次循环等待,死锁发生。

参考自链接:

https://www.zhihu.com/question/23338200/answer/57844956

http://www.jianshu.com/p/0b0d9b1f1f19

相关文章

  • dispatch_sync到底为什么死锁

    之前看面试题知道下面代码会死锁,网上说是因为相互等待,等等,总觉得难以理解 dispatch_sync(dispa...

  • 多线程进阶

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

  • 死锁问题

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

  • 面试题整理(一)

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

  • GCD2

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

  • GCD的基本语法

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

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

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

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

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

  • dispatch_sync 死锁该怎么理解?

    如果dispatch_sync()的目标queue为当前queue,会发生死锁(并行queue并不会). 我们知道...

  • iOS基础篇-GCD死锁

    GCD死锁概念: 使用GCD多线程编程时,如果同步函数dispatch_sync(),目标queue为当前queu...

网友评论

      本文标题:dispatch_sync到底为什么死锁

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