zoukankan      html  css  js  c++  java
  • iOS开发——高级篇——多线程GCD死锁

    面试题

    请问以下代码打印结果:

    - (void)interview01
    {
        // 以下代码是在主线程执行的
        NSLog(@"执行任务1");
        
        dispatch_queue_t queue = dispatch_get_main_queue();
        dispatch_sync(queue, ^{
            NSLog(@"执行任务2");
        });
        
        NSLog(@"执行任务3");
        
    }

    答案:没有打印,会产生死锁

    原因:

      判断是否死锁,由两个因素决定:

      1、在当前线程同步执行任务还是异步执行任务

      2、队列的类型,决定了任务的执行方式

    上面这个例子,是个经典的死锁问题,interview01这个任务是在主线程执行,dispatch_sync会立马在当前线程(主线程)同步执行任务,也就是说dispatch_sync中的block需要立即执行完毕之后代码才会继续往下走,而主线程是在主队列调度任务,此时调度的是interview01这个任务,主队列(特殊的串行队列),interview01这个任务没有执行完就无法调度其他任务,所以dispatch_sync中的block在等interview01任务,而interview01这个任务又卡在了dispatch_sync这个地方,双方相互等待,形成了死锁。


  • 相关阅读:
    Linux Commands
    sizeof操作符的使用详解
    在Vim中使用cscope
    MySQL学习笔记
    Online judge for leetcode
    使用Vim,让你工作效率更高
    Ext JS笔记
    安装J2EE开发环境
    这些都是什么啊
    QrCode二维码的实现原理
  • 原文地址:https://www.cnblogs.com/chglog/p/9577234.html
Copyright © 2011-2022 走看看