dispatch_sync中的死锁

时间:2014-08-14 00:26:47

标签: ios grand-central-dispatch

以下代码中的死锁。为什么呢?

dispatch_queue_t queue = dispatch_get_main_queue(); 
dispatch_async(queue, ^{
    dispatch_sync(queue, ^{
        NSLog(@"Hello?");
    }); 
});

1 个答案:

答案 0 :(得分:5)

这是因为dispatch_sync阻塞主线程线程,直到块完成运行。

因此它会永远等待,因为块应该运行的线程(主线程)被阻止。

该代码可简化为

dispatch_sync(dispatch_get_main_queue(), ^{
    NSLog(@"Hello?");
}); 

取自Concurrency Programming Guide的最后一段

  

不要从传递给函数调用的同一队列上执行的任务调用dispatch_sync函数。这样做会使队列死锁。如果需要调度到当前队列,请使用dispatch_async函数异步执行此操作。“

TL; DR

该代码尝试在被阻止的线程上运行代码块。