2011-12-29 18 views
7

ho qualche dubbio sul comportamento di questo codice:dispatch_sync chiamata in una chiamata dispatch_async

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

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

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

Da queste righe mi aspettavo di ottenere come output step1 -> step3 -> step2 ma ottengo solo step1.

Se cambio dispatch_sync con dispatch_async, funziona come previsto, Dispatch_sync in una chiamata dispatch_async crea questo tipo di problema?

Modifica dopo risposte ----------------

questo caso creare una situazione di stallo:

È possibile controllare risposta accettato di avere una spiegazione di questa situazione e controllare questo collegamento per la documentazione http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html

risposta

21

Questo è un punto morto.

La chiamata dispatch_sync sarà in attesa fino a quando queue è disponibile prima di eseguire il suo blocco e il ritorno, ma che non sarà disponibile fino a quando il dispatch_async ha finito così sarà solo stare lì a girare in attesa di chiamare dispatch_sync.

Problemi correlati