iOS中的线程死锁

作者: ChinaChong | 来源:发表于2018-09-12 18:06 被阅读36次

线程死锁产生的原因:在一个串行队列的任务中,再向这个队列添加同步任务。


典型例子:

image.png

我们分析一下:


image.png

主队列main_queue是一个串行队列,串行队列的特点就是队列中所有任务必须顺序执行。也就是说必须按照添加到队列中的先后顺序执行。

我们再看一张图:

image.png
我们在代码中使用dispatch_sync()函数给主队列添加了一个同步任务:
- (void)viewDidLoad {
    [super viewDidLoad];
    
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"线程死锁");
    });
}

也就是说后添加的同步任务5是在viewDidLoad任务2之后,只有等待任务2执行完之后才能执行任务5,这就是串行队列的特点。但是任务5是一个同步任务,必须等任务5执行完才能执行其它任务,因此造成互相等待的死锁。

再看一个例子

image.png

我们知道GCD分为同步任务和异步任务,最开始的例子是主线程的主队列,相当于是一个同步任务。而这个例子证明了,即便是在异步任务只要任务队列是串行队列,在串行队列的任务中再向队列添加同步任务,就会造成死锁,关键点不是同步还是异步,而是串行队列。

总结

dispatch_sync()函数会阻塞线程。当前队列是串行队列,任务必须顺序执行。在串行队列的任务A中给这个队列添加同步任务B,相当于说这个串行队列又多了一个任务B,任务B如果想要执行必须等待任务A执行完,但是任务B是同步任务,必须等任务B执行完才能执行其它任务,所以任务AB互相等待,造成死锁。

相关文章

  • 死锁 GCD 多线程

    死锁 GCD 多线程 Ios - LDSmallCat - 博客园 Ios中GCD死锁困扰很多人,分享一点个人经...

  • iOS中的线程死锁

    线程死锁产生的原因:在一个串行队列的任务中,再向这个队列添加同步任务。典型例子: 我们分析一下: 主队列main_...

  • iOS中的网络和多线程编程(六)

    摘自《iOS程序员面试笔试宝典》 什么是线程死锁 在讲解线程死锁前,首先看下面代码有什么问题? 在上述代码中,ma...

  • iOS-知识点

    五个案例让你明白GCD死锁:http://ios.jobbole.com/82622/ iOS开发中多线程间关于锁...

  • JavaEE面试题总结 Day39 2018-12-29

    什么是线程死锁?死锁如何产生?如何避免线程死锁? 死锁的介绍: 线程死锁是指由于两个或者多个线程互相持有对方所需要...

  • iOS线程死锁

    结论:使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁) 首先你要理解同步和异步执行的概念...

  • iOS线程死锁

    使用sync/async和queue的各种搭配时,常常有产生死锁崩溃的情况,现简单介绍几种死锁场景。 例一 打印了...

  • iOS 高级面试剖析课程-锁

    课程: 新浪微博资深大牛全方位剖析 iOS 高级面试 在iOS多线程中,经常会出现资源竞争和死锁的问题。本节将学习...

  • iOS 10线程死锁

    今天,项目在iOS 10 上运行遇到线程死锁,后台进前台就死锁,导致ui卡死,在点击授权的alert也会卡死,比如...

  • Python中的各种锁

    Python之死锁 死锁分为两种情况,多进程/线程的死锁.或者是单线程的死锁. 1.首先看一下单线程的死锁,单线程...

网友评论

  • 码省理工0:大爱,很不错,感谢分享,也是对自己的一次总结和提升

本文标题:iOS中的线程死锁

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