iphone - 为什么对主队列的 dispatch_sync( ) 调用会阻塞主队列?

标签 iphone ios multithreading

我知道这不是一个强有力的问题,但我必须弄清楚这个概念。

我定义了 myBlock 如下。

void(^myBlock)(void) = ^{
   for(int i = 0;i < 10 ; i++)
   {
       NSLog(@"%d and current queue = %@",i,[NSThread currentThread]);
   } 
};

现在在 viewDidLoad 方法中,当我在主队列上独立使用 dispatch_sync() 方法时,主队列被阻塞。

这是示例。

- (void)viewDidLoad
 {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue,myBlock);
 }

但是但是,当我在主线程上使用相同的 dispatch_sync() 函数时 在并发队列上触发的 dispatch_async() 函数 block 中然后主线程不阻塞。

这是示例。

- (void)viewDidLoad
 {
    [super viewDidLoad];
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_async(queue,^{  

        dispatch_sync(dispatch_get_main_queue(),myBlock);
    });
 }

我不清楚为什么会这样?为什么主线程在独立调用dispatch_sync()时阻塞?

最佳答案

在串行队列(如主队列)上使用 dispatch_sync 时,当前线程必须等待,直到执行分派(dispatch)的代码。

当 block 从串行队列同步分派(dispatch)到同一队列时,会发生死锁。

关于iphone - 为什么对主队列的 dispatch_sync( ) 调用会阻塞主队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18740872/

相关文章:

c - 意外的 pthread 函数输出

iphone - phonegap 插件,用于从库中选择视频

objective-c - NSArray 与 C 类型?

iphone - 如何在 iPhone 中解析 xml,

ios - Xcode 11 GM Seed 工具链无效

java - 哪些Python模块将有效利用多核处理大量传入消息

java - Java内存模型如何确保所有线程看到的变量值一致?

ios - IOS8+ 通知中心应用不显示

ios - 在 MVVM 中传回数据

ios - 从 NSArray 分配给 NSMutableString 的不兼容指针类型