iOS GCD中遇到的线程锁死

先上代码

 - (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又让主线程先走导致冲突,引起了主线程的锁死。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容