diff --git a/README.md b/README.md index 41d5d17..c0c6020 100644 --- a/README.md +++ b/README.md @@ -599,6 +599,16 @@ int main(int argc, char *argv[]) ## Exercice 1 +1. Est-ce que l’exécution de ce programme est correcte? Vous pouvez vous en assurer en l’exécutant plusieurs fois. + +> L’exécution de ce programme n’est pas correcte car quand nous exécutons le programme on retrouve plusieurs des threads qui affichent la même valeur de `i`. + +2. Si vous pensez (et avez constaté) que ce n’est pas le cas, expliquez pourquoi. + +> Car il y a une variable `i` qui est partagée entre les threads et qui est modifié par le thread principal en même temps que les autres threads lisent la variable `i`. + +3. Modifiez le code pour qu’il donne le résultat attendu. + ## Exercice 2 ## Exercice 3 diff --git a/TP6/Exo1/ex1.c b/TP6/Exo1/ex1.c new file mode 100644 index 0000000..d674c61 --- /dev/null +++ b/TP6/Exo1/ex1.c @@ -0,0 +1,31 @@ +#include +#include +#include +#include + +#define NUM_THREADS 16 + +void *thread(void *thread_id) +{ + int id = *((int *)thread_id); + printf("Hello from thread %d\n", id); + + return NULL; +} + +int main(int argc, char *argv[]) +{ + pthread_t threads[NUM_THREADS]; + int th[NUM_THREADS]; + + for (int i = 0; i < NUM_THREADS; i++) + { + th[i] = i; + assert(pthread_create(&threads[i], NULL, thread, &th[i]) == 0); + } + + for (int i = 0; i < NUM_THREADS; i++) + assert(pthread_join(threads[i], NULL) == 0); + + return EXIT_SUCCESS; +}