以下代码中的死锁。为什么呢?
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_async(queue, ^{
dispatch_sync(queue, ^{
NSLog(@"Hello?");
});
});
答案 0 :(得分:5)
这是因为dispatch_sync
阻塞主线程线程,直到块完成运行。
因此它会永远等待,因为块应该运行的线程(主线程)被阻止。
该代码可简化为
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"Hello?");
});
取自Concurrency Programming Guide的最后一段
不要从传递给函数调用的同一队列上执行的任务调用dispatch_sync函数。这样做会使队列死锁。如果需要调度到当前队列,请使用dispatch_async函数异步执行此操作。“
TL; DR
该代码尝试在被阻止的线程上运行代码块。