iOS开发-dispatch_sync阻塞主线程造成死锁

本文通过具体的代码示例,详细解析了使用dispatch_sync在主线程上可能引发的死锁问题。文章展示了如何通过同步调度阻塞主线程,并解释了这种情况下为何会导致应用程序卡死。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    NSLog(@"之前 - %@", [NSThread currentThread]);

    dispatch_sync(dispatch_get_main_queue(), ^{
         NSLog(@"sync - %@", [NSThread currentThread]);
    });

    NSLog(@"之后 - %@", [NSThread currentThread]);

运行结果:主线程卡死

打印:之前 - <NSThread: 0x6000000610c0>{number = 1, name = main}

原因:
同步任务会阻塞当前线程,然后把 Block 中的任务放到指定的队列中执行,只有等到 Block 中的任务完成后才会让当前线程继续往下运行。

那么这里的步骤就是:
打印完第一句后,dispatch_sync 立即阻塞当前的主线程,然后把 Block 中的任务放到 main_queue 中, main_queue 中的任务会被取出来放到主线程中执行,但主线程这个时候已经被阻塞了,所以 Block 中的任务就不能完成,它不完成,dispatch_sync 就会一直阻塞主线程,这就是死锁现象。导致主线程一直卡死。

同样的题目:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"1");

    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
    NSLog(@"3");
}

答案:只输出:1 。发生主线程锁死。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值