2011-12-29 6 views
7

consigo algunas dudas acerca de la conducta de este código:dispatch_sync llamada en una dispatch_async

dispatch_async(queue, ^{ 
    sleep(2); 
    NSLog(@"step1"); 

    dispatch_sync(queue, ^{ 
     sleep(3); 
     NSLog(@"step 2"); 
    }); 

    NSLog(@"step 3"); 
}); 

A partir de estas filas que esperaba obtener como salida step1 -> step3 -> step2 pero sólo obtienen step1.

Si cambio dispatch_sync con dispatch_async funciona como se esperaba, ¿dispatch_sync en una llamada dispatch_async crea este tipo de problema?

Edición después de respuestas ----------------

Este caso crear un punto muerto:

Puede comprobar respuesta aceptada tener explicación de esta situación y consulte este enlace para obtener documentación http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html

Respuesta

21

Eso es un interbloqueo.

La llamada dispatch_sync estará esperando hasta que queue está disponible antes de ejecutar su bloque y volver, pero que no estará disponible hasta que el dispatch_async ha terminado por lo que sólo se sentará allí girar a la espera de llamar dispatch_sync.

Cuestiones relacionadas