tutorials grand dispatchqueue dispatch_async central async ios grand-central-dispatch

ios - grand - Número de hilos creados por GCD?



ios tutorials (2)

¿Hay alguna buena documentación sobre la cantidad de subprocesos creados por GCD? En WWDC, nos dijeron que está modelado alrededor de núcleos de CPU. Sin embargo, si llamo a este ejemplo:

for (int i=1; i<30000; i++) { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [NSThread sleepForTimeInterval:100000]; }); }

abre 66 hilos, incluso en un iPad1. (También abre 66 hilos cuando se llama a Lion de forma nativa). ¿Por qué 66?


La documentación evita mencionar el número de hilos creados. Sobre todo porque el número óptimo de hilos depende en gran medida del contexto.

Un problema con Grand Cendral Dispatch es que generará un nuevo hilo si se bloquea una tarea en ejecución. Es decir, debe evitar el bloqueo cuando utilice GCD, ya que tener subprocesos más que núcleos no es óptimo.

En su caso, GCD detecta que la tarea está inactiva y genera un nuevo hilo para la siguiente tarea.

¿Por qué 66 es el límite está más allá de mí.


Primero, 66 == 64 (el tamaño máximo del grupo de subprocesos GCD) + el subproceso principal + algún otro subproceso aleatorio que no sea GCD.

En segundo lugar, GCD no es magia. Está optimizado para mantener la CPU ocupada con el código que está principalmente vinculado a la CPU. La "magia" de GCD es que crea dinámicamente más subprocesos que CPU cuando los elementos de trabajo involuntariamente esperan brevemente a que se completen las operaciones.

Dicho esto, el código puede confundir al programador de GCD al dormir o esperar intencionalmente eventos en lugar de usar fuentes de envío para esperar eventos. En estos escenarios, el bloque de trabajo está implementando efectivamente su propio planificador y, por lo tanto, GCD debe asumir que el subproceso se ha cooptado desde el conjunto de subprocesos.

En resumen, el grupo de subprocesos funcionará de manera óptima si su código prefiere dispatch_after () sobre "sleep ()" como las API, y despacha las fuentes sobre los bucles de eventos hechos a mano (Unix select () / poll (), Cocoa Runloops, o POSIX) .