美文网首页
主线程死锁问题

主线程死锁问题

作者: 面朝对象_春暖花开 | 来源:发表于2017-02-19 17:04 被阅读25次

dispatch_sync(dispatch_get_main_queue(), ^(){

       NSLog(@"222");

   });

这个死锁问题我自己的理解是这样的,dispatch_sync的第一个参数是主队列,意思是在主队列加一个同步任务,所以说任务是在主队列的主线程执行。

  而你将这段代码写在主线程中,意思是这个任务是由主线程去创建。

  所以问题来了:主线程里面加入了一个任务,既然是同步,所以主线程需要这个任务即打印222执行完才能做别的,而打印222这个任务要等主线程释放出来才能执行,所以block 等待主线程执行,主线程等待block 执行完成才去打印。死锁产生,下图:

主线程死锁问题

打印222永远执行不到,因为主线程要等打印222结束才能去执行打印222.

新的理解:dispatch_sync的第一个参数是代表block里面的操作在哪里执行,而dispatch_sync写在那个线程就代表哪个线程去创建这个任务。同步代表谁去创建谁就要去等待任务的block 执行完才能做别的事去。

如何解决:按照我上面的分析,要不主线程只管去创建,创建完了他就不管了,那就用dispatch_async执行任务的操作由新创建的线程去执行去。

要么:主线程不去创建了,由主线程去执行block即打印222,但是创建任务的工作分给其他线程去做:就是dispatch _sync这个语录不能写在主线程

- (void)viewDidLoad

{

   [super viewDidLoad];

   dispatch_async(dispatch_get_global_queue(0, 0), ^{

   dispatch_sync(dispatch_get_main_queue(), ^{

       NSLog(@"222");

   });

});

}

相关文章

  • 面试官:连多线程问题你都一问三不知,还要我怎么“放水”?

    面试官:问你几个多线程相关的问题吧,说一下导致线程死锁的原因,怎么解除线程死锁? 程序员阿里:这个...死锁......

  • Synchronized关键字详解2(对非object持锁)

    4.死锁:同步方法容易造成死锁。Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能被释放的锁...

  • GCD分析(中)

    同步函数死锁 死锁现象 主线程因为同步函数的原因等着先执⾏任务 主队列等着主线程的任务执⾏完毕再执⾏⾃⼰的任务 主...

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

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

  • 关于主线程执行同步任务造成死锁的思考

    经典问题重现 bug 粘贴主线程+同步造成死锁 要想明白,为什么造成死锁,首先要搞懂主线程是干嘛的 主线程程序运行...

  • jstack命令:教你如何排查多线程问题

    这是之前的一个死锁案例: 一个多线程死锁案例,如何避免及解决死锁问题? 如程序中发生这样的死锁问题该如何排查呢?我...

  • Python中的各种锁

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

  • 防止死锁的加锁机制

    防止死锁的加锁机制 问题 你正在写一个多线程程序,其中线程需要一次获取多个锁,此时如何避免死锁问题。 解决方案 在...

  • 5. 死锁

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

  • 主线程死锁问题

    dispatch_sync(dispatch_get_main_queue(), ^(){ NSLog(@"...

网友评论

      本文标题:主线程死锁问题

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