iOS开发基础93-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这个地方,双方相互等待,形成了死锁。


 

posted @   Mr.陳  阅读(1398)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示