Has escuchado mal. Bien puede ser que "i++"
sea seguro para subprocesos para un compilador específico y una arquitectura de procesador específica, pero no es obligatorio en los estándares en absoluto. De hecho, dado que el subproceso múltiple no forma parte de los estándares ISO C o C ++ (a) , no puede considerar que nada sea seguro para subprocesos en función de lo que cree que se compilará.
Es bastante factible que se ++i
pueda compilar en una secuencia arbitraria como:
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
que no sería seguro para subprocesos en mi CPU (imaginaria) que no tiene instrucciones de incremento de memoria. O puede ser inteligente y compilarlo en:
lock ; disable task switching (interrupts)
load r0,[i] ; load memory into reg 0
incr r0 ; increment reg 0
stor [i],r0 ; store reg 0 back to memory
unlock ; enable task switching (interrupts)
donde lock
deshabilita y unlock
habilita las interrupciones. Pero, incluso entonces, esto puede no ser seguro para subprocesos en una arquitectura que tiene más de una de estas CPU compartiendo memoria (lalock
posible que solo deshabilite las interrupciones para una CPU).
El lenguaje en sí (o las bibliotecas para él, si no está integrado en el lenguaje) proporcionará construcciones seguras para subprocesos y debe usarlas en lugar de depender de su comprensión (o posiblemente malentendido) de qué código de máquina se generará.
Cosas como Java synchronized
y pthread_mutex_lock()
(disponible para C / C ++ en algunos sistemas operativos) son lo que necesita examinar (a) .
(a) Esta pregunta se hizo antes de que se completaran los estándares C11 y C ++ 11. Esas iteraciones ahora han introducido el soporte de subprocesos en las especificaciones del lenguaje, incluidos los tipos de datos atómicos (aunque ellos, y los subprocesos en general, son opcionales, al menos en C).