美文网首页iOS开发Kevin的IOS开发专题
iOS开发-dispatch_sync阻塞主线程造成死锁

iOS开发-dispatch_sync阻塞主线程造成死锁

作者: Pandakingli | 来源:发表于2017-11-12 10:52 被阅读10次
    NSLog(@"之前 - %@", [NSThread currentThread]);
    
    dispatch_sync(dispatch_get_main_queue(), ^{
         NSLog(@"sync - %@", [NSThread currentThread]);
    });
   
    NSLog(@"之后 - %@", [NSThread currentThread]);

运行结果:主线程卡死

打印:之前 - <NSThread: 0x6000000610c0>{number = 1, name = main}

原因:
同步任务会阻塞当前线程,然后把 Block 中的任务放到指定的队列中执行,只有等到 Block 中的任务完成后才会让当前线程继续往下运行。

那么这里的步骤就是:
打印完第一句后,dispatch_sync 立即阻塞当前的主线程,然后把 Block 中的任务放到 main_queue 中, main_queue 中的任务会被取出来放到主线程中执行,但主线程这个时候已经被阻塞了,所以 Block 中的任务就不能完成,它不完成,dispatch_sync 就会一直阻塞主线程,这就是死锁现象。导致主线程一直卡死。

同样的题目:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"1");

    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
    NSLog(@"3");
}

答案:只输出:1 。发生主线程锁死。

相关文章

  • iOS开发-dispatch_sync阻塞主线程造成死锁

    运行结果:主线程卡死 原因:同步任务会阻塞当前线程,然后把 Block 中的任务放到指定的队列中执行,只有等到 B...

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

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

  • iOS多线程方案

    在iOS开发中需要将一些耗时操作放到子线程中去执行, 防止阻塞主线程造成卡顿现象, 这时就用到了多线程.本篇文章主...

  • GCD学习总结

    串行同步会造成死锁 执行顺序 :1 5 2 4 3 异步不阻塞线程

  • GCD dispatch_sync同步线程死锁

    先看个例子? 上面例子打印结果 只打印出了rb001 , 因为dispatch_sync产生了线程死锁。报错了 主...

  • 多线程进阶

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

  • GCD的基本语法

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

  • 5. 死锁

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

  • Something About NSThread

    iOS开发中不能将太耗时的操作放在主线程中执行,否则会造成线程的阻塞。通常解决方案就是将耗时的操作另开一个线程执行...

  • JavaSE进阶十 线程二

    死锁 什么是死锁 死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若...

网友评论

    本文标题:iOS开发-dispatch_sync阻塞主线程造成死锁

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