es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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>

Tags:  ,

Answer

  1. Avatar for 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 estructuras arg utilizando malloc() y pasar un puntero a cada hilo. Otra forma es declarar un arreglo de estructuras arg y pasar la dirección del elemento correspondiente a cada hilo.

    Aquí tienes un ejemplo de código utilizando el segundo enfoque:

    #include <pthread.h>
    #include <stdio.h>
    
    typedef struct argument {
        int index;
        int sum;
    } arg;
    
    void *fonction(void *arg0) {
        arg *a = (arg *) arg0;
        a->sum += a->index * 1000000;
        return NULL;
    }
    
    int main() {
        pthread_t thread[5];
        arg arguments[5];
        int order[5];
    
        for (int i = 0; i < 5; i++)
            order[i] = i;
    
        for (int i = 0; i < 5; i++) {
            arguments[i].index = order[i];
            arguments[i].sum = 0;
            pthread_create(&thread[i], NULL, fonction, &arguments[i]);
        }
    
        for (int i = 0; i < 5; i++)
            pthread_join(thread[i], NULL);
    
        int total_sum = 0;
        for (int i = 0; i < 5; i++)
            total_sum += arguments[i].sum;
    
        printf("%d\n", total_sum);
    
        return 0;
    }
    

    En este código, se declara un arreglo de estructuras arg llamado arguments, y cada hilo recibe la dirección del elemento correspondiente en el arreglo. Esto asegura que cada hilo tenga su propia estructura arg 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 de 10000000.</stdio.h></pthread.h>

Comments are closed.