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

标签 ios grand-central-dispatch deadlock

苹果文档说:(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/

相关文章:

ios - 扩展 EXT_shader_texture_lod 不适用于 OpenGL ES 3.0 iOS

iphone - 使用 PhoneGap 将音频录制到 iOS 上的文档文件夹

ios - swift中的UIView水平条动画

iphone - GameKit 多线程发送可能吗?

iphone - 什么是首选: implement method with GCD inside and then just simple call,或Implement方法,然后在以后使用GCD调用它?

multithreading - 我可以假设计划在串行队列上运行的 block 将全部在同一线程上运行吗?

c# - ASP.NET Identity 中的零星应用程序死锁

iphone - Spotify/Rdio 底部工具栏 View Controller 转换

java - 创建作业实例时出现死锁

sql-server-2008 - Sql Server 2008 中的死锁故障排除