dispatch_sync中的死锁

Jac*_*cky 0 grand-central-dispatch ios

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

dispatch_queue_t queue = dispatch_get_main_queue(); 
dispatch_async(queue, ^{
    dispatch_sync(queue, ^{
        NSLog(@"Hello?");
    }); 
});
Run Code Online (Sandbox Code Playgroud)

cre*_*orn 5

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

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

该代码可以简化为

dispatch_sync(dispatch_get_main_queue(), ^{
    NSLog(@"Hello?");
}); 
Run Code Online (Sandbox Code Playgroud)

摘自" 并发编程指南"的最后一段

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

TL; DR

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