当前位置 : 主页 > 手机开发 > ios >

ios – 为什么在当前队列中调用dispatch_sync不会导致死锁

来源:互联网 收集:自由互联 发布时间:2021-06-11
苹果文档说:( concurrencyProgrammingGuide,page49) 要点:您永远不应该从正在计划传递给该函数的同一队列中执行的任务调用dispatch_sync或dispatch_sync_f函数.这对于保证死锁的串行队列尤其重要,但
苹果文档说:( 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()返回系统定义的全局并发队列.
网友评论