J'ai quelques doutes sur le comportement de ce code:
dispatch_async(queue, ^{ sleep(2); NSLog(@"step1"); dispatch_sync(queue, ^{ sleep(3); NSLog(@"step 2"); }); NSLog(@"step 3"); });
A partir de ces lignes, je m'attendais à get en tant que sortie step1 -> step3 -> step2
mais step1 -> step3 -> step2
seulement step1
.
Si je change dispatch_sync avec dispatch_async cela fonctionne comme prévu, Est-ce que dispatch_sync dans un appel dispatch_async crée ce genre de problème?
Modifier après les réponses —————-
Cette affaire crée une impasse:
Vous pouvez vérifier la réponse acceptée pour avoir une explication de cette situation et consultez ce lien pour la documentation http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html
C'est une impasse.
L'appel de dispatch_sync
attendra jusqu'à ce que la queue
soit disponible avant d'exécuter son bloc et de revenir, mais cela ne sera pas disponible tant que le dispatch_async
n'aura pas terminé. Il restra donc en attente de tourner dispatch_sync
.
Comme mentionné par @mattjgalloway, c'est une impasse.
La propre documentation d'Apple mentionne le problème ici: http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html (voir "VERROUILLAGES RECURSIFS"). Il est discuté dans le context des verrous récursifs, mais le principe est le même.