in

multiproceso: ¿Qué es una condición de carrera?

apple touch icon@2

Existe una «condición de carrera» cuando el código multiproceso (o paralelo) que accedería a un recurso compartido podría hacerlo de tal manera que provoque resultados inesperados.

Toma este ejemplo:

for ( int i = 0; i < 10000000; i++ )
{
   x = x + 1; 
}

Si tuviera 5 subprocesos ejecutando este código a la vez, el valor de x NO terminaría siendo 50.000.000. De hecho, variaría con cada ejecución.

Esto se debe a que, para que cada hilo incremente el valor de x, tienen que hacer lo siguiente: (simplificado, obviamente)

Retrieve the value of x
Add 1 to this value
Store this value to x

Cualquier hilo puede estar en cualquier paso de este proceso en cualquier momento, y pueden pisarse entre sí cuando se trata de un recurso compartido. El estado de x puede ser cambiado por otro subproceso durante el tiempo entre que se lee x y cuando se vuelve a escribir.

Digamos que un hilo recupera el valor de x, pero aún no lo ha almacenado. Otro hilo también puede recuperar el mismo valor de x (porque ningún hilo lo ha cambiado todavía) y entonces ambos estarían almacenando el mismo valor (x + 1) de nuevo en x!

Ejemplo:

Thread 1: reads x, value is 7
Thread 1: add 1 to x, value is now 8
Thread 2: reads x, value is 7
Thread 1: stores 8 in x
Thread 2: adds 1 to x, value is now 8
Thread 2: stores 8 in x

Las condiciones de carrera pueden evitarse empleando algún tipo de cierre mecanismo antes del código que accede al recurso compartido:

for ( int i = 0; i < 10000000; i++ )
{
   //lock x
   x = x + 1; 
   //unlock x
}

Aquí, la respuesta es 50.000.000 cada vez.

Para obtener más información sobre el bloqueo, busque: mutex, semáforo, sección crítica, recurso compartido.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Python 3 – Argumentos de la línea de comandos

8bNZYymmTYbsXrt3EyA39a 1200 80

Spider-Man 3: el regreso de Tobey Maguire potencialmente filtrado por el actor de doblaje