苹果文档说:(concurrencyProgrammingGuide,page49) 重要提示:您永远不应从计划传递给函数的同一队列中执行的任务调用 dispatch_sync 或 dispatch_sync_f 函数。这对于保证死锁的串行队列尤为重要,但对于并发队列也应避免。
但是这里的代码不会导致死锁,因为我已经运行了很多次了:
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^(){
NSLog(@"in outer queue: %@", [NSThread currentThread]);
dispatch_sync(concurrentQueue, ^(){
NSLog(@"do someting thread: %@", [NSThread currentThread]);
});
});
然而,我们都知道,在主线程上下文中,如果我们执行下面的代码,就会导致主线程死锁。所以我很困惑为什么在同一个线程中调用 dispatch_sync,一个不是死锁(上面的代码),另一个相反(下面的代码)?
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"________update__UI");
});
最佳答案
dispatch_get_global_queue()
返回一个系统定义的全局并发队列。
关于ios - 为什么在当前队列中调用 dispatch_sync 不会导致死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31157224/