Procedente de Java, estoy intentando aprender seguridad de subprocesos en Objective-C. Hasta ahora he incliné queUsando @synchronized, volátil y OSMemoryBarrier() todos juntos. ¿Implica uno el otro?
- bloques @synchronized impiden el acceso concurrente a la misma bloque de código
- las variables volátiles aseguran la visibilidad de los cambios cruzando hilos
- OSMemoryBarrier(); asegura el correcto orden de acceso
Mi pregunta es: ¿alguno de ellos implica uno o más de los otros? Si quiero los tres, ¿necesito usar las tres técnicas?
Ejemplo:
volatile int first = 0;
volatile int second = 0;
[...]
@synchronized {
OSMemoryBarrier();
first++;
OSMemoryBarrier();
second++;
OSMemoryBarrier();
}
En Java los tres están asegurados al entrar y salir de un bloque sincronizada y al leer o escribir una variable volátil. ¿Cierto?
Entonces, ¿entrar y salir del bloque sincronizado constituye el paso de barreras de memoria? Y si el acceso a una variable está protegido por un bloque sincronizado, la variable no necesita ser volátil, porque los cambios son siempre visibles para otros hilos. – Twilite
Encontré más en volátil en las respuestas a esta pregunta: http://stackoverflow.com/questions/6866206/volatile-and-createthread Parece que volátil no representa una barrera de memoria y es inútil para la sincronización del acceso entre subprocesos. – Twilite