美文网首页
iOS GCD-主线程同步执行死锁问题

iOS GCD-主线程同步执行死锁问题

作者: riner | 来源:发表于2017-10-14 18:03 被阅读0次

在使用GCD的过程中,会遇到许多线程死锁的问题,会导致程序循环等待,然后直到奔溃。下来我们就说说GCD主线程同步执行死锁。

那主线程同步执行是怎样的呢?

首先看这样的代码:

NSLog(@"start");
dispatch_sync(dispatch_get_main_queue(), ^{
    NSLog(@"middle");
});
NSLog(@"end");

执行结果:

Screen Shot 2017-10-14 at 5.46.57 PM.png
程序奔溃 打印结果: start

那么我们不禁要问,这样的死锁是如何产生的呢?!

是因为到程序执行到start的时候 ,sync创建了一个同步执行的线程(创建的线程称B,主线程称线程A),而因为B是同步线程,所以它必须要等待主线程A执行完之后才能去执行线程B,而这个时候线程B又嵌套在主线程A内,所以A和B开始竞争资源,产生死锁

那么主线程同步正确应该是怎样的呢?
NSLog(@"A");
dispatch_async(dispatch_get_global_queue(0, 0), ^{
   dispatch_async(dispatch_get_main_queue(), ^{
       NSLog(@"线程同步");
   });
});
NSLog(@"B");
[NSThread sleepForTimeInterval:4];
NSLog(@"C");

执行结果:

Screen Shot 2017-10-14 at 6.01.23 PM.png

相关文章

  • iOS GCD-主线程同步执行死锁问题

    出自:huazhume 在使用GCD的过程中,会遇到许多线程死锁的问题,会导致程序循环等待,然后直到奔溃。下来我们...

  • IOS开发-主线程同步执行死锁问题

    用过GCD的朋友都知道,直接调用主线程同步执行会死锁,那主线程同步执行创建出来有什么用?代码如下:主线程和主队列的...

  • iOS笔记-多线程

    同步函数&串行队列 不会开启线程,在当前线程执行任务 任务串行执行,任务一个接着一个 会产生堵塞(死锁,崩溃) 主...

  • GCD分析(中)

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

  • GCD 使用过程中的出现的死锁问题

    死锁 1、 主队列在主线程同步执行 下列代码写在 viewDidLoad 中: 上面死锁的写法是: ** 主队列...

  • GCD的相关使用

    一、同步执行 + 主队列 运行结果: 线程死锁。为什么呢?- (void)syncMain {} ----> 任务...

  • 7.3 多线程-GCD

    多线程-GCD 多线程-GCD-串行并行 多线程-GCD.png GCD-线程的通讯、延时操作、定时器 GCD-线...

  • GCD学习总结

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

  • 06 GCD 并发队列

    03 GCD-并发队列 并发队列,异步执行 问题:1.会开几条线程?会开多条线程,线程数量是由GCD来决定2.会顺...

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

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

网友评论

      本文标题:iOS GCD-主线程同步执行死锁问题

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