iOS dispatch_sync(dispatch_get_main_queue(), ^{ });死锁的原因

- (void)viewDidLoad {
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@1);
        //死锁原因
        //1:dispatch_sync 在等待 block 语句执行完成,而 block 语句需要在主线程里执行,所以dispatch_sync如果在主线程调用就会造成死锁
        //2:dispatch_sync 是同步的,本身就会阻塞当前线程,即主线程。而又往主线程里塞进去一个 block,所以就会发生死锁。
    });

    dispatch_async(dispatch_get_global_queue(), ^{
        //async 在主线程中 创建了一个异步线程 加入 全局并发队列,async 不会等待 block 执行完成,立即返回
        NSLog(@2);//不会造成死锁
    });
}

分析这段代码:

viewDidLoad 在主线程中,即 dispatch_get_main_queue() 中,执行到 sync 时向 dispatch_get_main_queue() 插入同步 thread,sync 会等到后面的 block 执行完成才返回。sync 又在主队列里面,是个串行队列,sync 是后面才加入的,前面一个是主线程,所以 sync 想执行 block 必须等待前一个主线程执行完成,而主线程却在等待 sync 返回,去执行后续工作,从而造成死锁。

 

dispatch_sync 和 dispatch_async 区别:

dispatch_async(queue,block) async 异步队列,dispatch_async 函数会立即返回, block会在后台异步执行。
dispatch_sync(queue,block) sync 同步队列,dispatch_sync 函数不会立即返回,即阻塞当前线程,等待 block同步执行完成。

 

GCD Queue 分为三种队列:

串行队列:Dispatch Queues 或者 Serial Queues
并发队列 :Concurrent Queues
主队列:main dispatch Queue

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值