dispatch_queue_t es queue de serie, entonces, ¿por qué existe en el concepto de multi-tarea?

Soy más nuevo en el desarrollo de iPhone y en el concepto GCD para multihilo.

'dispatch_queue_t' crea una queue de serie y he leído que una queue de serie solo ejecutará un trabajo a la vez. GCD tiene la intención de ejecutar varias tareas simultáneamente, ¿por qué existe la queue de serie?

Por ejemplo, quiero hacer 2 tareas. Tarea A y Tarea B. Creo una queue en serie para ejecutar estas dos tareas. Estoy haciendo esto en la queue principal. Aquí está el código de lo que estoy haciendo:

dispatch_queue_t my_serial_queue = dispatch_queue_create("queue_identifier", 0); dispatch_sync(my_serial_queue, ^{ NSLog(@"Task 1"); }); dispatch_sync(my_serial_queue, ^{ NSLog(@"Task 2"); }); 

Ahora, de acuerdo con la regla, la tarea se ejecutará en serie, ya que es la queue de serie, es decir, la Tarea A se ejecuta primero y luego de finalizar Tarea A, se ejecutará Tarea B. Y también me está dando la misma salida en el logging.

Entonces, mi pregunta es: ¿qué pasa si quiero ejecutar ambas tareas simultáneamente? Si la respuesta de esta pregunta es crear otra queue en serie para la Tarea B, el código debería estar estructurado de la siguiente manera:

 dispatch_queue_t my_serial_queue_1 = dispatch_queue_create("queue_identifier_1", 0); dispatch_queue_t my_serial_queue_2 = dispatch_queue_create("queue_identifier_2", 0); dispatch_sync(my_serial_queue_1, ^{ NSLog(@"Task 1"); }); dispatch_sync(my_serial_queue_2, ^{ NSLog(@"Task 2"); }); 

Estoy obteniendo el mismo resultado. La razón es que estoy usando la llamada 'dispatch_sync' en lugar de la llamada 'dispatch_async'. Pero como estoy ejecutando las tareas en diferentes queues, ¿no deberían ejecutarse simultáneamente? Si no, entonces, ¿por qué deberíamos crear una queue diferente? Podría haber utilizado la misma queue mediante la llamada 'dispatch_async' para ejecutar ambas tareas simultáneamente.

Realmente necesito una respuesta a esta pregunta porque, antes de diseñar la estructura de mis aplicaciones multitarea en el futuro, me guiará mejor.

Aprecie su consejo. Gracias por adelantado.

Su confusión se debe a que está utilizando dispatch_sync. dispatch_sync no es una herramienta para get ejecución simultánea, es una herramienta para limitarlo temporalmente por razones de security.

Una vez que usa dispatch_async, puede get concurrency al tener más de una queue o al usar queues simultáneas. El propósito de usar las queues en serie en este context es controlar qué trabajo se realiza simultáneamente.

Considere el siguiente ejemplo muy tonto:

 __block void *shanetworking = NULL; for (;;) { dispatch_async(aConcurrentDispatchQueue, ^{ shanetworking = malloc(128); free(shanetworking); } } 

esto se bloqueará, porque eventualmente, dos de los bloques que se ejecutan simultáneamente liberarán 'compartido' en una fila. Este es un ejemplo artificial, obviamente, pero en la práctica, casi todos los estados mutables compartidos no deben cambiarse al mismo time. Las queues en serie son su herramienta para asegurarse de que lo haga.

Resumiendo:

  • Cuando el trabajo en sus bloques es verdaderamente independiente y seguro para subprocesss, y puramente computacional, continúe y use dispatch_async en una queue concurrente
  • Cuando tiene tareas lógicamente independientes que consisten en varios bloques relacionados, use una queue de serie para cada tarea
  • Cuando tenga trabajo que acceda al estado mutable compartido, haga esos accesos en los bloques dispatch_sync () ed en una queue de serie y el rest del trabajo en una queue simultánea
  • Cuando necesite hacer un trabajo relacionado con la interfaz de usuario, dispatch_async o dispatch_sync a la queue principal, dependiendo de si necesita esperar a que finalice o no

'dispatch_queue_t' no crea nada. dispatch_queue_t es una queue de despacho, serie o concurrente.

dispatch_queue_create tiene dos parameters. El segundo parámetro decide si la queue que crea es una queue serie o simultánea. Pero generalmente no crea queues concurrentes usted mismo, pero usa una de las tres queues concurrentes existentes.

dispatch_sync distribuye un bloque en una queue y espera hasta que finalice el bloque . Debería ser obvio que esto mucho limita la concurrency. Casi siempre deberías usar dispatch_async.

Las queues secuenciales solo pueden ejecutar un bloque a la vez. Debería ser obvio que esto mucho limita la concurrency. Las queues secuenciales siguen siendo útiles cuando necesita ejecutar varios bloques uno tras otro, y pueden ejecutarse simultáneamente con bloques en otras queues.

Entonces, para un uso máximo de los procesadores, use dispatch_async en una queue simultánea. Y no hay necesidad de crear más de una queue simultánea. Es concurrente Puede ejecutar cualquier cantidad de bloques al mismo time.