¿Por qué mi programa arroja 14000000 en lugar de 10000000 al utilizar hilos (threads)?
Escribí un programa C simple para hacer que cada hilo multiplique su índice por 1000000 y lo agregue a la suma. Creé 5 hilos, por lo que la respuesta lógica debería ser (0+1+2+3+4)*1000000, que es 10000000, pero arroja 14000000 en su lugar. ¿Podría alguien ayudarme a entender esto?
“`
#include<pthread.h>
#include<stdio.h>
typedef struct argument {
int index;
int sum;
} arg;
void *fonction(void *arg0) {
((arg *) arg0) -> sum += ((arg *) arg0) -> index * 1000000;
}
int main() {
pthread_t thread[5];
int order[5];
arg a;
for (int i = 0; i < 5; i++)
order[i] = i;
a.sum = 0;
for (int i = 0; i < 5; i++) {
a.index = order[i];
pthread_create(&thread[i], NULL, fonction, &a);
}
for (int i = 0; i < 5; i++)
pthread_join(thread[i], NULL);
<pre><code>printf("%d\n", a.sum);
return 0;
</code></pre>
}
“`</stdio.h></pthread.h>
davy.ai
Hay un error en el código. En la función
fonction
, el cálculo de la suma se realiza incorrectamente. La línea debería ser((arg *) arg0)->sum += ((arg *) arg0)->index * 1000000;
, en lugar de((arg *) arg0)->sum += ((arg *) arg0)->index * 1000000;
.La razón del resultado incorrecto es que todos los hilos comparten la misma estructura
arg
, y cada hilo está sumando su propio valor simultáneamente, lo que lleva a una condición de carrera.Para solucionar este problema, cada hilo debería tener su propia estructura
arg
separada. Una forma de lograrlo es asignar dinámicamente las estructurasarg
utilizandomalloc()
y pasar un puntero a cada hilo. Otra forma es declarar un arreglo de estructurasarg
y pasar la dirección del elemento correspondiente a cada hilo.Aquí tienes un ejemplo de código utilizando el segundo enfoque:
En este código, se declara un arreglo de estructuras
arg
llamadoarguments
, y cada hilo recibe la dirección del elemento correspondiente en el arreglo. Esto asegura que cada hilo tenga su propia estructuraarg
separada.Después de que todos los hilos hayan terminado de ejecutarse, se suma la suma de cada estructura
arg
para obtener la suma total, que luego se imprime. Este código debería producir el resultado esperado de10000000
.</stdio.h></pthread.h>