Bonsoir à tous, j'ai demain un partiel de prog système et je suis en train de réviser à l'aide des annales des années précédentes.
Un exo a attiré mon attention, il s'agit d'un code dans lequel se trouvent "deux erreurs grossières" :
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>
#define NBTH 10
int somme = 0;
void * ajouteur(void * arg) {
int numthread = * (int*) arg;
int i;
printf("ajouteur: getpid()=%d\n", getpid());
for (i = 0; i < 1000000; i++) {
somme += numthread;
}
return NULL;
}
int main(int argc, char** argv) {
int i;
pthread_t threads[NBTH];
printf("main: getpid()=%d\n", getpid());
for (i = 0; i < NBTH; i++) {
pthread_create(
&threads[i], NULL, ajouteur, &i);
}
for (i = 0; i < NBTH; i++) {
pthread_join(threads[i], NULL);
}
printf("somme=%d\n", somme);
return 0;
}
Selon moi, la première erreur grossière est évidemment d'avoir passé i (qui est l'itérateur de boucle) en paramètre dans le pthread_create, provoquant une condition de compétition. Cependant, je peine à trouver la deuxième erreur : serait-ce la variable somme déclarée en globale ?
Merci d'avance pour votre aide 