在main中创建的同步呼叫串行队列是正常的,而在main中的同步呼叫主队列是DEAD-LOCK

时间:2016-12-24 09:26:51

标签: ios multithreading grand-central-dispatch deadlock dispatch

int main(void) {
    dispatch_queue_t queue = dispatch_queue_create(“com.somecompany.queue”, nil);
    dispatch_sync(queue, ^{ // task 1
        NSLog(@"Situation 1"); 
    });
    return 0;
}

这可以在main()中运行。

// -------------------------------------------

int main(void) {
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{ // task 1
        NSLog(@"Situation 2"); 
    });
    return 0;
}

这是main()中的DEAD-LOCK。

// -------------------------------------------

为什么情况1可以,而情况2是DEAD-LOCK?两者都是主线程中的同步调用串行队列。

或者只是因为sync()本身在主队列中运行?

1 个答案:

答案 0 :(得分:0)

在第一种情况下,您阻止主队列,直到任务在您创建的调度队列上完成执行,因此没有问题。

在第二种情况下,您尝试在主队列上调度任务,但主队列被dispatch_sync阻止,因此提交的闭包无法启动。结果是死锁