2012-08-15 16 views
5

Por lo que yo entiendo las colas GCD que no son de cola principal, son de serie por defecto solo en dispositivos con CPU de un solo núcleo. Pero si un dispositivo tiene múltiples núcleos, puede suceder que los bloques en la cola se ejecuten simultáneamente.¿Cómo crear una cola de GCD que siempre es serial, incluso en CPU multi-core?

Quiero utilizar una cola serial GCD para superar algunos problemas de simultaneidad y esta cola debe ser serial incluso si hay múltiples núcleos.

Un desarrollador mencionó que esto es posible de alguna manera. ¿Cómo crearía una cola siempre en serie?

+0

contestado desde http://stackoverflow.com/questions/5026043/concurrency-and-serial-queues-in -grand-central-dispatch. Use dispatch_sync en su cola GCD – CSmith

+2

@CSmith Nope. Eso es sincrónico, no serial. Si tenía una tarea asíncrona en la cola, podría ejecutarse al mismo tiempo que su bloque de sincronización. –

+0

@CSmith también, si la cola en cuestión es una cola concurrente global, dispatch_sync es equivalente a dispatch_async, por lo que tampoco funcionaría allí. – jkh

Respuesta

9

Las colas GCD estándar que se pueden obtener con la función dispatch_get_global_queue son concurrentes.

pero se pueden crear utilizando cola personalizada gcd dispatch_queue_create función. Pase DISPATCH_QUEUE_SERIAL como un segundo parámetro para crear esa cola como serial.

+1

¿Sería DISPATCH_QUEUE_SERIAL serial, sin importar cuántos núcleos de CPU hay? Me preocupa que pueda ser serial por núcleo pero no del todo. ¿Qué tan seguro estás de que este es el truco? –

+0

@InternationalFrog, asegurarse de que las tareas se ejecutan una tras otra es el objetivo principal de las colas en serie, así que creo que debería estar bien, independientemente de la cantidad de núcleos. – Vladimir

+2

@InternationalFrog - Sí, las colas en serie que usted crea usando 'dispatch_queue_create()' se garantiza que serán en serie, sin importar el número de núcleos. Los bloques dentro de ellos pueden ejecutarse en diferentes hilos, pero siempre se ejecutarán uno a la vez. Utilizo esto para bloquear de forma económica los recursos compartidos en algunos lugares. –

6

Para crear colas concurrente:
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.aj.concurrent.queue", DISPATCH_QUEUE_CONCURRENT);

Para crear colas de serie:
dispatch_queue_t serialQueue = dispatch_queue_create("com.aj.serial.queue", DISPATCH_QUEUE_SERIAL);

Cuestiones relacionadas