Se dice que un programa sufre este problema cuando el resultado puede ser correcto o incorrecto dependiendo de cómo se de la casualidad de que se entrelacen los threads. Básicamente el problema aparece cuando varios threads hacen ciclos de modificación de una variable compartida (lectura + modificación + escritura) y el ciclo completo se ve interrumpido
Ejemplo:
|
thread 1 { x = x+5; } |
thread 2 { x = x+100; } |
t0 |
x vale 100 |
|
t1 |
lee 100 |
|
t2 |
incrementa a 105 |
|
t3 |
|
lee 100 |
t4 |
escribe 105 |
|
t5 |
|
incrementa a 200 |
t6 |
|
escribe 200 |
final |
x vale 200 |
Es el problema principal que hace que los programas sean incorrectos.
Es un problema muy difícil de detectar, pues el programa puede funcionar bien millones de veces y de repente fallar porque se da una coincidencia imprevista. Es por ello que mucho esfuerzo de la programación concurrente se dedica a construir el programa de forma que no puedan haber carreras. Eso suele exigir pruebas formales de seguridad.
Temas relacionados