Antes de Grand Central Dispatch (GCD), escribir código concurrente en Cocoa significaba administrar hilos a mano: crear un NSThread o un pthread, decidir cuántos crear, sincronizar el acceso a los datos compartidos con locks, y destruirlos cuando ya no se necesitaban. Cada una de esas decisiones era responsabilidad del desarrollador, y cada una era una oportunidad para introducir un bug: crear demasiados hilos, olvidar un lock, o dejar un hilo vivo más tiempo del necesario.
Apple presentó GCD en el WWDC de 2009, junto con Mac OS X Snow Leopard. Su implementación, libdispatch, se liberó como código abierto ese mismo año. La idea central fue cambiar la pregunta que se hace el desarrollador: en lugar de pensar "¿en qué hilo va a correr esto?", GCD propone pensar "¿en qué cola va a correr esto?".
El cambio de modelo: de hilos a colas
En GCD no se crean hilos directamente. Se envía un bloque de trabajo (una clausura) a una DispatchQueue, y es el sistema operativo quien decide en qué hilo se ejecuta, cuándo, y cuántos hilos mantener vivos. El desarrollador delega esa responsabilidad.
DispatchQueue.global().async {
// El sistema decide en qué hilo corre esto
print(Thread.current == Thread.main) // false
print("Trabajo en segundo plano, hilo: \(Thread.current)")
}
No hay creación explícita de hilos en este ejemplo. Solo se describe el trabajo y se envía a una cola.
¿Por qué es "seguro y optimizado"?
Seguro, porque la cola es la responsable de administrar el ciclo de vida de los hilos. Ya no se gestiona manualmente la creación ni la destrucción, lo que elimina una categoría entera de errores propios de la administración manual de hilos.
Optimizado, porque GCD ajusta el tamaño del pool de hilos según la cantidad de núcleos disponibles y la carga del sistema en tiempo de ejecución, en lugar de usar un número fijo de hilos decidido a priori por el desarrollador. Esto evita tanto la sub-utilización del CPU (pocos hilos, núcleos desaprovechados) como la sobre-asignación (más hilos que núcleos, con el costo de cambio de contexto que eso implica).
Lo que viene
GCD organiza el trabajo en DispatchQueue, que es el concepto central de todo lo demás en este módulo: tipos de cola, prioridad, y las distintas formas de despachar tareas (síncrona vs. asíncrona, serial vs. concurrente). Eso es lo que cubre el siguiente artículo.
Top comments (0)