iphone objective-c ios grand-central-dispatch

iphone - dispatch_async vs. dispatch_sync usando colas en serie en Grand Central Dispatch



objective-c ios (2)

OK, me encanta Grand Central Dispatch y después de usarlo con un éxito relativo, pero esto es algo que no entiendo completamente.

Supongamos que he creado mi propia cola serie utilizando

dispatch_queue_t myQueue; myQueue = dispatch_queue_create("myQueue", NULL);

Después de eso hago esto:

dispatch_async(myQueue, ^{ [self doStuff1]; }); // and a few lines later... dispatch_sync(myQueue, ^{ [self doStuff2]; });

El primer envío es asíncrono. Entonces, se hará al mismo tiempo, ¿verdad? ¿Cómo puede ser eso si myQueue es serial? ¿Cómo puede una cola serial hacer cosas en paralelo o, si lo prefiere, desordenar?

Gracias


Ni dispatch_async ni dispatch_sync cambian la forma en que el bloque se pone en cola. Si la cola es serial, los bloques se ejecutarán de manera serial, si la cola es concurrente, de manera concurrente.

La diferencia importante entre los dos es que dispatch_sync pone en cola el bloque y espera en el subproceso de ejecución actual hasta que se ejecuta ese bloque y dispatch_async simplemente pone en cola el bloque y continúa la ejecución de las instrucciones posteriores.


dispatch_async() significa que el bloque está en cola y dispatch_async() vuelve a poner en cola otra tarea / bloque (posiblemente) antes de que se ejecute el bloque.

Con dispatch_sync() , el bloque se pone en cola y la función no continuará poniendo en cola otra tarea / bloque hasta que se ejecute el bloque.

Los bloques todavía se ejecutan en serie. Podría ejecutar 100 llamadas dispatch_async() , cada una con un bloque que duerme durante 100 segundos, y sería muy rápido. Síguelo con una llamada a dispatch_sync() en la misma cola serial y dispatch_sync() devolverá ~ 10,000 segundos más tarde.

Para ponerlo más simple:

dispatch_async(serialQ, block1); dispatch_async(serialQ, block2); dispatch_sync(serialQ, block3);

block1 se ejecutará antes del block2 que se ejecutará antes del block3 . Ese es el orden garantizado por la cola serial.

Sin embargo, las llamadas a dispatch_async() pueden retornar antes de que cualquiera de los bloques comience a ejecutarse. ¡ dispatch_sync() no regresará antes de que se ejecuten los tres bloques!