1. Cocoaheads Madrid
PROGRAMACIÓN MULTI-HILO
PARA IPHONE
Geppy Parziale
www.invasivecode.com info@invasivecode.com
2. Cocoaheads Madrid
La terminología de Cocoa
• thread: un proceso unico de ejecución
• process: un ejecutable que abarca hilos
multiples
• task: concepto abstracto del trabajo
executado por parte de un hilo
www.invasivecode.com info@invasivecode.com
3. Cocoaheads Madrid
Ventajas
• Soporte de multiprocesador
• Efectuar más funciones en paralelo
• Evitar funciones de bloque
www.invasivecode.com info@invasivecode.com
4. Cocoaheads Madrid
Desventajas
• (Muy) difícil de programar!!!
• Deadlocks y sincronización
• No siempre multi-hilo significa “más rapido”
www.invasivecode.com info@invasivecode.com
5. Cocoaheads Madrid
NSThread
• Se basa en el API multi-hilo POSIX API: /usr/include/pthread.h
• Es una capa de alto nivel en el Foundation framework
www.invasivecode.com info@invasivecode.com
6. Cocoaheads Madrid
Cocoa Touch
• Un run-loop es instanciado automáticamente para cada hilo
• Existen métodos para la comunicación entre hilos
• Necesitas crear un “autorelease pool” para cada hilo
www.invasivecode.com info@invasivecode.com
7. Cocoaheads Madrid
UIKit Thread-Unsafe
• UIKit no es “thread-safe”
• Tienes que solucionarlo tú mismo
www.invasivecode.com info@invasivecode.com
9. Cocoaheads Madrid
Lock
• Es un mecanismo de sincronización
• Evita que diferentes hilos tengan acceso a los mismos datos
• NSLock, NSConditionLock, NSRecursiveLock, NSLocking
- (void)doSomething {
[aLock lock];
! // Solo un hilo por vez puede ejecutar este código
! [aLock unlock]
}
www.invasivecode.com info@invasivecode.com
10. Cocoaheads Madrid
Condiciones
• Son un alternativa al “Lock”
• Optima solución en el caso de Productor/Consumidor
• NSCondition // Hilo consumidor
- (void)consumeData
// Hilo productor
{
- (void)produceData
! [condition lock];
{
! while(!newDataExists) {
! [condition lock];
! ! [condition wait];
! // Nuevos datos producidos
! }
! newDataExists = YES;
! // Consuma los nuevos datos
! [condition signal];
! newDataExists = NO;
! [condition unlock]; ! [condition unlock];
} }
www.invasivecode.com info@invasivecode.com
11. Cocoaheads Madrid
Alternatives
• Multi-hilos, locks y condiciones son muy difícil de gestionar
• Hay alternativas; Timers, Métodos Asíncronos, ...
www.invasivecode.com info@invasivecode.com
12. Cocoaheads Madrid
NSOperation
• Es una alternativa al multi-hilo de alto nivel
• Se basa en el concepto de “unidad de trabajo”
• Te permite especificar las dependencias y las prioridades
entre unidades
• Te permite organizar las unidades en NSOperationQueue
www.invasivecode.com info@invasivecode.com
13. Referencia
• Threading Programming Guide, Apple Documentation
• Advanced Mac OS X Programming, M. Dalrymple y A.
Hillegass, Big Nerd Ranch
www.invasivecode.com info@invasivecode.com