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

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

作者: 奋斗的小牛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(@"任务三!!!!");  // 这里是子线程
        });
    

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

    相关文章

      网友评论

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

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