iOS线程死锁

作者: iOS猿_员 | 来源:发表于2019-06-07 15:05 被阅读0次

结论:使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列(产生死锁)

首先你要理解同步和异步执行的概念,同步和异步目的不是为了是否创建一个新的线程,同步会阻塞当前函数的返回,异步函数会立即返回执行下面的代码;队列是一种数据结构,队列有FIFO,LIFO等,控制任务的执行顺序,至于是否开辟一个新的线程,因为同步函数会等待函数的返回,所以在当前线程执行就行了,没必要浪费资源再开辟新的线程,如果是异步函数,当前线程需要立即函数返回,然后往下执行,所以函数里面的任务必须要开辟一个新的线程去执行这个任务。

队列上是放任务的,而线程是去执行队列上的任务的

【问题1】:以下代码是在主线程执行的,会不会产生死锁?会!

NSLog(@"执行任务1");
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"执行任务2");
});

NSLog(@"执行任务3");

dispatch_sync立马在当前线程同步执行任务

分析:

  • 1、主线程中任务执行:任务1、sync、任务3、
  • 2、主队列:viewDidLoad、任务2、

其中在主队列viewDidLoad里面的任务3执行结束才会执行任务2;而主线程中是执行完sync才会执行任务3。也就是任务2等待任务3执行,任务3再也等待任务2执行,造成死锁

【问题2】:以下代码是在主线程执行的,会不会产生死锁?不会!

- (void)interview02
{

NSLog(@"执行任务1");

dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
NSLog(@"执行任务2");
});

NSLog(@"执行任务3");

// dispatch_async不要求立马在当前线程同步执行任务
}

因为dispatch_async不要求立马在当前线程同步执行任务,不会造成线程死锁

【问题3】:以下代码是在主线程执行的,会不会产生死锁?会!

NSLog(@"执行任务1");

dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{ // 0
NSLog(@"执行任务2");

dispatch_sync(queue, ^{ // 1
NSLog(@"执行任务3");
});

NSLog(@"执行任务4");
});

NSLog(@"执行任务5");

其中执行任务3执行任务4之间造成死锁

【问题4】:以下代码是在主线程执行的,会不会产生死锁?不会!

- (void)interview04
{

NSLog(@"执行任务1");

dispatch_queue_t queue = dispatch_queue_create("myqueu", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{ // 0
NSLog(@"执行任务2");

dispatch_sync(queue, ^{ // 1
NSLog(@"执行任务3");
});

NSLog(@"执行任务4");
});

NSLog(@"执行任务5");
}

推荐个不错的iOS进阶视频,感兴趣可看一看:观看地址

相关文章

  • 死锁 GCD 多线程

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

  • iOS线程死锁

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

  • iOS线程死锁

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

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

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

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

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

  • 2019 iOS面试题-----进程、线程、多进程、多线程、任务

    2019 iOS面试题-----多线程相关之GCD、死锁、dispatch_barrier_async、dispa...

  • iOS 10线程死锁

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

  • iOS-知识点

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

  • Python中的各种锁

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

  • 5. 死锁

    线程死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

网友评论

    本文标题:iOS线程死锁

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