[死锁] dispatch_sync 之于 当前线程

本文通过实例代码分析了iOS中使用dispatch_sync导致死锁的原因,解释了为何在当前线程队列中调用dispatch_sync会造成应用程序无响应,并提供了解决方案。
摘要由CSDN通过智能技术生成

1: dispatch_sync 是指在指定 线程队列queue 同步执行任务blockdispatch_sync具有等待block执行结束再能回调的特点

void
dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);


因此,使用dispatch_sync的时候,需要注意啦,不要在当前线程队列,执行block任务,

不然会死锁!!!!dead-lock!!!!!


为什么呢?下面用Viewcontroller具体代码展示  !


- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    NSLog(@"Hello 1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"Hello 2");
    });
    NSLog(@"Hello 3");
}

这个会怎么输出呢?------答案是:Hello 1 ,而且输出这个后,App会进入死锁,任何点击都没响应!

解析:

当代码 在主线程 执行到dispatch_sync块代码(在主线程压入这行代码进行执行),

但是执行这代码,不能马上执行结束回调,而是等待(这行代码继续压在队列中),

然后又在当前队列压入block 任务,而block任务也不能被执行,因为dispatch_sync代码块

先执行(FIFO)且未执行结束,所以block需要等待dispatch_sync,但是dispatch_sync具有等待block执行结束再能回调的特点

就这样,他们互相等待对方,因此死锁!


因此,不要dispatch_sync把block压入当前队列,对于这样代码,我们可以这样写:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 这里当前线程是主线程,
    dispatch_queue_t myQueue = dispatch_queue_create("MyQueue", NULL);
    
    NSLog(@"Hello 1");
    dispatch_sync(myQueue, ^{
        NSLog(@"Hello 2");
    });
    NSLog(@"Hello3");
    
}

这样就会输出:

Hello 1

Hello 2

Hello 3


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值