iOS GCD中遇到的线程锁死

2017-08-08  本文已影响0人  温柔vs先生

先上代码

 - (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"%@",[NSThread currentThread]);
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"sync----%@",[NSThread currentThread]);
    });
    NSLog(@"%@",[NSThread currentThread]);
}

控制台输出

我们可以看到控制台只打印输出了第一个log,第二和第三个log为什么没有走进来呢?这是因为当前线程为主线程,而主线程默认都是串行队列(串行队列都是先进先出,一步一步执行的),当你用gcd创建一个同步任务时,并没有开辟一个子线程所以只有当gcd的同步块走完以后才会走第三个log输出,而当他走gcd的同步任务时,此任务又让回到主线程执行任务(dispatch_get_main_queue),主线程又是串行的 所以只有当主线程执行完成以后才会走block里面的任务,从而出现了主线程让gcd先走,而gcd又让主线程先走导致冲突,引起了主线程的锁死。

上一篇下一篇

猜你喜欢

热点阅读