Tengo una pregunta con respecto a la seguridad de subprocesos en Objective-C. He leído un par de otras respuestas, alguna de la documentación de Apple, y todavía tengo algunas dudas con respecto a esto, así que pensé en hacer mi propia pregunta.Bloquear un objeto para que no sea accedido por varios subprocesos - Objective-C
Mi pregunta es triple:
Supongamos que tengo una matriz, NSMutableArray *myAwesomeArray;
Fold 1:
Ahora me corrija si estoy equivocado, pero por lo que entiendo , utilizando @synchronized(myAwesomeArray){...}
evitará que dos subprocesos accedan al mismo bloque de código. Así que, básicamente, si tengo algo como:
-(void)doSomething {
@synchronized(myAwesomeArray) {
//some read/write operation on myAwesomeArray
}
}
entonces, si dos subprocesos tienen acceso a la mismo método en el momento misma, ese bloque de código se hilo de seguridad. Supongo que he entendido esta parte correctamente.
Fold 2:
¿Qué hago si se está accediendo myAwesomeArray
por múltiples hilos de diferentes métodos? Si tengo algo como:
- (void)readFromArrayAccessedByThreadOne {
//thread 1 reads from myAwesomeArray
}
- (void)writeToArrayAccessedByThreadTwo {
//thread 2 writes to myAwesomeArray
}
Ahora, tanto los métodos se accede por dos hilos diferentes al mismo tiempo. ¿Cómo me aseguro de que myAwesomeArray
no tenga problemas? ¿Utilizo algo como NSLock o NSRecursiveLock?
Fold 3:
Ahora, en los dos casos anteriores, myAwesomeArray
era un Ivar en la memoria. ¿Qué ocurre si tengo un archivo de base de datos que no siempre guardo en la memoria? Creo un databaseManagerInstance
cada vez que quiero realizar operaciones de bases de datos, y lo libero una vez que termino. Por lo tanto, básicamente, diferentes clases pueden acceder a la base de datos. Cada clase crea su propia instancia de DatabaseManger
, pero básicamente, todas usan el mismo archivo de base de datos. ¿Cómo me aseguro de que los datos no estén dañados debido a las condiciones de carrera en una situación así?
Esto me ayudará a aclarar algunos de mis fundamentos.
'@ synchronize' impide que otros hilos accedan a la misma variable que se ha bloqueado, no bloque que de código específica. –
Ah. Ya veo. Bueno, supongo que había algo más de lo que había entendido sobre la directiva @synchronize. ¡Gracias! : D – codeBearer
@codeBearer He respondido su pregunta en http://stackoverflow.com/a/15393623/412916 Un poco. – Jano