Последовательная очередь вызовов синхронизации, созданная в основном, в порядке, в то время как основная очередь вызовов синхронизации в основном является DEAD-LOCK

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;
}

Это DEAD-LOCK в main().

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

Почему ситуация 1 в порядке, а ситуация 2 тупиковая? Оба являются последовательной очередью вызовов синхронизации в основном потоке.

Или только потому, что сам sync() запускается в основной очереди?


person abyn    schedule 24.12.2016    source источник


Ответы (1)


В первом случае вы блокируете основную очередь до тех пор, пока не завершится выполнение задачи в созданной вами очереди отправки, поэтому проблем не возникает.

Во втором случае вы пытаетесь отправить свою задачу в основную очередь, но основная очередь заблокирована dispatch_sync, поэтому отправленное закрытие не может начаться. Результат - тупик

person Paulw11    schedule 24.12.2016
comment
То есть int main(void) {NSLog(@"Task 1"); return 0;}, NSLog() запускается в основной очереди? Или все функции, запускаемые в main(), выполняются в основной очереди? - person abyn; 25.12.2016
comment
Все в вашей программе выполняется в основной очереди, за исключением кода, который вы явно отправляете в другую очередь. Код в основной очереди всегда будет выполняться в основном потоке. Код, отправленный в другую очередь, может выполняться или не выполняться в основном потоке. - person Paulw11; 25.12.2016
comment
О, так вот что это! Спасибо @Paulw11, теперь я все знаю. - person abyn; 25.12.2016