appel dispatch_sync dans un appel dispatch_async

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.