2012-06-11 10 views
39

Estoy escribiendo un programa iOS moderadamente complejo que necesita tener múltiples hilos para algunas de sus operaciones más largas (análisis, conexiones a la red ... etc.). Sin embargo, estoy confundido en cuanto a cuál es la diferencia entre dispatch_get_global_queue y dispatch_queue_create.¿Cuál es la diferencia entre dispatch_get_global_queue y dispatch_queue_create?

¿Cuál debo usar y podría darme una explicación simple de cuál es la diferencia en general? Gracias.

+1

Ya .. u recogió respuesta equivocada. La respuesta de Robert Ryan es más apropiada –

Respuesta

68

A medida que el documentation describe, una cola global es bueno para tareas concurrentes (es decir, que va a enviar varias tareas de forma asíncrona y que está perfectamente feliz si coincide en el tiempo) y si no quiere encontrarse con el teórico sobrecarga de crear y destruir tu propia cola.

La creación de su propia cola es muy útil si necesita una cola en serie (es decir, necesita que los bloques enviados se ejecuten de uno en uno). Esto puede ser útil en muchos escenarios, como cuando cada tarea depende de la anterior o cuando se coordina la interacción con algún recurso compartido de múltiples hilos.

Menos común, pero también querrás crear tu propia cola si necesitas usar barriers junto con una cola simultánea. En ese escenario, cree una cola concurrente (es decir, dispatch_queue_create con la opción DISPATCH_QUEUE_CONCURRENT) y use las barreras junto con esa cola. Nunca debe usar barreras en colas globales.

Mi asesor general es si necesita una cola en serie (o necesita usar barreras), luego cree una cola. Si no lo hace, siga adelante y use la cola global y omita los gastos generales de crear la suya propia.


Si desea una cola concurrente, pero desea controlar cómo muchas operaciones pueden ejecutarse simultáneamente, también se puede considerar el uso de NSOperationQueue que tiene una propiedad maxConcurrentOperationCount. Esto puede ser útil al hacer operaciones de red y no desea que se envíen demasiadas solicitudes concurrentes a su servidor.

+2

Aunque tenga en cuenta que en Lion ahora es posible obtener una cola simultánea de 'dispatch_queue_create()' pasando 'DISPATCH_QUEUE_CONCURRENT'. No está especificado (y probablemente no importe) si esto solo devolverá una de las colas globales existentes. –

+1

Debería haber agregado, "presumiblemente, que la funcionalidad llegará a iOS eventualmente". –

+1

Upvoted para indicar correctamente las diferencias en el término de colas concurrentes y en serie. – user523234

0

Uno devuelve la cola global existente, la otra crea una nueva. En lugar de usar GCD, consideraría usar NSOperation y la cola de operaciones. Puede encontrar más información al respecto in this guide. Normalmente, si desea que las operaciones se ejecuten simultáneamente, desea crear su propia cola y colocar sus operaciones en ella.

+0

Solo para aclarar, si está creando una cola de envío, es en serie. Si está utilizando la cola de despacho global, puede ser concurrente (pero no está garantizado). Supongo que su consejo sobre la creación de colas para la concurrencia está relacionado con las colas de operaciones, no con las colas de despacho. (Sé que lo sabes, pero solo quería asegurarme de que los lectores no estuvieran confundidos). – Rob

+1

Sí, estoy hablando de colas de operaciones. Estaba enfrentando el mismo problema hace un tiempo, y cuando creé mi propia cola de operaciones sin ninguna configuración adicional, las operaciones agregadas en ella se ejecutaron simultáneamente. –

40

acaba de publicar en una respuesta diferente, pero aquí es algo que escribí hace un tiempo posterior:

La mejor manera de conceptualizar las colas es darse cuenta en primer lugar que en el bajo nivel muy, sólo hay dos tipos de colas: seriales y concurrentes.

Las colas en serie son monógamas, pero no están comprometidas. Si le da un montón de tareas a cada cola en serie, las ejecutará una a la vez, usando solo un hilo a la vez. El aspecto no confirmado es que las colas en serie pueden cambiar a un hilo diferente entre las tareas. Las colas en serie siempre esperan a que una tarea finalice antes de pasar a la siguiente. Por lo tanto, las tareas se completan en orden FIFO. Puede hacer tantas colas en serie como necesite con dispatch_queue_create.

La cola principal es una cola serie especial. A diferencia de otras colas en serie, que no están comprometidas, dado que están "fechando" muchos hilos pero solo uno a la vez, la cola principal está "unida" al hilo principal y todas las tareas se realizan en él.Los trabajos en la cola principal deben comportarse bien con el runloop para que las operaciones pequeñas no bloqueen la IU y otros bits importantes. Al igual que todas las colas en serie, las tareas se completan en orden FIFO.

Si las colas en serie son monógamas, entonces las colas concurrentes son promiscuas. Presentarán tareas a cualquier hilo disponible o incluso crearán nuevos hilos dependiendo de la carga del sistema. Pueden realizar múltiples tareas simultáneamente en diferentes hilos. Es importante que las tareas enviadas a la cola global sean seguras para hilos y minimicen los efectos secundarios. Las tareas se envían para su ejecución en orden FIFO, pero el orden de finalización no está garantizado. Al escribir estas líneas, solo hay tres colas concurrentes y no puedes hacerlas, solo puedes buscarlas con dispatch_get_global_queue.

edición: entrada de blog en la expansión de esta respuesta: http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html

+2

Mejor. Responder. Nunca. –

+1

El enlace a la publicación del blog está muerto. –

+0

Todavía parece funcionar para mí. Recientemente actualicé motores de blog, por lo que hay una nueva dirección canónica aquí: http://amattn.com/p/grand_central_dispatch_gcd_summary_syntax_best_practices.html – amattn

Cuestiones relacionadas