美文网首页
关于主队列添加同步任务会崩溃

关于主队列添加同步任务会崩溃

作者: 奋斗的小牛06107 | 来源:发表于2018-04-11 21:42 被阅读0次
NSLog(@"任务1");
dispatch_sync(dispatch_get_main_queue(),^{
NSLog(@"任务2");
});
NSLog(@"任务3");

运行结果:只打印出“任务1”
执行步骤是:

  1. 任务1肯定会执行;
  2. 然后遇到了dispatch_sync,这是一个同步线程,同步线程会阻塞当前线程,必须等同步线程中的任务(任务2)执行完毕之后才会执行下一个任务(任务3),这时候会进入等待状态(等任务2执行完成并返回);
  3. dispatch_get_main_queue()是一个主队列,有任务来(任务3)就要加进去,而这时任务2处于等待中,所以就会先加入任务3,之后任务2就排在了任务3的后面。
  4. 这样就造成了这么一种状态:
    dispatch_sync说:我是同步的,必须要等我的任务(任务2)执行完再执行其他任务(任务3);任务2--->任务3
    dispatch_get_main_queue()说:我是一个主队列,有人来我就要让他排队,谁先排队谁先执行(FIFO),任务2还没过来,所以任务3来了之后我就让他先排队,等任务2来了让它排在任务3后面再执行;任务3--->任务2
    这就导致任务3在等任务2执行、任务2在等任务3执行,结果谁都执行不了。

如何解决呢?

//    void (^task)() = ^{
//        NSLog(@"这里!!!!%@",[NSThread currentThread]);
//        dispatch_queue_t t = dispatch_get_main_queue();
//        //    同步任务
//        dispatch_sync(t, ^{
//            NSLog(@"能来吗?%@",[NSThread currentThread]);
//        });
//        NSLog(@"come here ");
//    };
//     dispatch_async(dispatch_get_global_queue(0, 0), task);

dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"任务一!!!%@",[NSThread currentThread]);
        dispatch_queue_t t = dispatch_get_main_queue();
        //    同步任务
        dispatch_sync(t, ^{
            NSLog(@"任务二!!!!%@",[NSThread currentThread]);
        });
        NSLog(@"任务三!!!!");  // 这里是子线程
    });

将这个操作整体放在一个子线程中,这是任务一就在子线程,任务二在主线程,任务三依然是子线程。这时主队列就只有一个同步操作。不会造成相互等待的死锁。

相关文章

  • 关于主队列添加同步任务会崩溃

    运行结果:只打印出“任务1”执行步骤是: 任务1肯定会执行; 然后遇到了dispatch_sync,这是一个同步线...

  • iOS 多线程:GCD

    同步执行(sync): 同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之...

  • GCD线程死锁

    GCD 以下情况下会死锁,(不考虑线程锁的情况下) 主队列中同步添加任务。 串行队列任务中添加同步任务 为什么呢?...

  • iOS笔记-多线程

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

  • iOS 多线程之GCD

    GCD核心概念 任务 :执行的操作 队列 :执行任务的等待队列 任务 同步执行 :同步添加任务到指定的队列中,如果...

  • CGD相关知识

    GCD队列总体分为同步队列和异步队列两种,添加到同步队列中的任务,根据添加的顺序挨个执行,添加到异步队列里面的任务...

  • iOS 解决同步任务提交当前队列死锁问题

    场景 同步提交到主队列 死锁,崩溃。 原因: 主队列在执行viewDidLoad任务,又同步执行block任务;v...

  • 死锁gcd

    串行队列中添加同步会造成死锁,互相等待同步任务执行完才能执行下一个 全局的并行队列不会死锁

  • Swift GCD 死锁

    1. 串行队列中,在异步任务中添加同步任务 2. 主线程同步

  • nextTick、setImmediate、promise.re

    执行队列(同步) 任务队列(异步事件) 每当异步任务完成后会在任务队列中添加一个关联事件,待执行队列任务执行完成...

网友评论

      本文标题:关于主队列添加同步任务会崩溃

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