Race conditions en C son situaciones en las que, al ejecutar múltiples hilos o subprocesos de forma concurrente, la secuencia de ejecución de las operaciones puede generar un comportamiento inesperado o incorrecto. Esto se deber a que los hilos acceden y modifican variables compartidas sin sincronizar apropiadamente.
Supongamos dos hilos que intentan cambiar el valor de una variable compartida, x, entre 0 y 1:
#include <stdio.h>
#include <threads.h>
// Variable compartida
int x = 0;
void *hilo1(void *arg) {
// Cambiar x de 0 a 1
x = 1;
// Esperar un tiempo aleatorio
thrd_sleep((struct timespec[]){{1, 0}}, NULL);
return NULL;
}
void *hilo2(void *arg) {
// Cambiar x de 1 a 0
x = 0;
return NULL;
}
int main() {
thrd_t h1, h2;
thrd_create(&h1, hilo1, NULL);
thrd_create(&h2, hilo2, NULL);
thrd_join(h1, NULL);
thrd_join(h2, NULL);
// Imprimir el valor de x
printf("x = %d\n", x);
}
Sin sincronización adecuada, el resultado final de x podría ser inesperado, ya que los hilos pueden ejecutarse en orden erróneo. Por ejemplo, puede que hilo2 cambie x a 0 antes de que hilo1 cambie x a 1. Un posible resultado incorrecto sería que x sea 0.
Para resolver este problema, se deberían utilizar mecanismos de sincronización, como semáforos, mutexes o condiciones de variación, para asegurar el acceso apropiado a las variables compartidas.