0

La file d'attente de synchronisation d'appel créée dans main est OK tandis que la file principale d'appel de synchronisation dans main est DEAD-LOCK

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

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

Ceci est DEAD-LOCK dans le main().

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

Pourquoi la situation 1 est-elle OK alors que la situation 2 est DEAD-LOCK? Les deux sont la file d'attente de synchronisation de l'appel dans le thread principal. Ou simplement parce que sync() s'exécute dans la file d'attente principale?

Répondre

0

Dans le premier cas, vous bloquez la file d'attente principale jusqu'à l'exécution de la tâche dans la file d'attente de répartition que vous avez créée, donc il n'y a pas de problème. Dans le deuxième cas, vous tentez d'envoyer votre tâche dans la file d'attente principale, mais la file d'attente principale est bloquée par le dispatch_sync, de sorte que la fermeture soumise ne peut pas démarrer. Le résultat est un blocage

+0

Est-ce à dire, 'int main (void) {NSLog (@" Tâche 1 "); return 0;} ', le' NSLog() 'est exécuté sur la file d'attente principale? Ou toutes les fonctions exécutées dans 'main()' sont exécutées dans la file d'attente principale? – aByn

+0

Tout dans votre programme s'exécute dans la file d'attente principale à l'exception du code que vous envoyez explicitement dans une autre file d'attente. Le code de la file d'attente principale sera toujours exécuté sur le thread principal. Le code distribué sur une autre file d'attente peut ou non s'exécuter sur le thread principal. – Paulw11

+0

Oh, c'est ce que c'est! Thx à @ Paulw11, maintenant je sais les choses. – aByn