#include #include #include #include #define NUM_THREADS 16 void *thread(void *thread_id) { long id = ((long ) thread_id); printf("Hello from thread %ld\n", id); return (void*)(2*id); } int main() { pthread_t threads[NUM_THREADS]; int t[NUM_THREADS]; long res; for (long i = 0; i < NUM_THREADS; i++){ // t[i] = i; assert( pthread_create(&threads[i], NULL, thread, (void*)i) == 0); } for (int i = 0; i < NUM_THREADS; i++){ assert( pthread_join(threads[i],(void *)&res) == 0); printf("%ld\n",res); } return EXIT_SUCCESS; } // 1.L'execution est-elle correcte ? // Non la version est fause /*On voit parfois des IDS faux/repetés selon les exécutions. 2. Si ce n'est pas le cas, expliquez pourquoi Probleme : (Parce qu'on passe l'adresse d'une variable partagée (&i) qui change pendant la creation des threads. Les threads lisent la meme adresse, pas uenc opie de la valeur -> condition de course + duree de vie/visibilité non garanties) &i est l'adresse de la meme variable i de la bouche (une seule variable, qui change de valeur). Les threads démarrent en parrallèle et lisent tous la meme adresse.h Comme i continue de s'incrementer, le contenu vu par les threads depends du timing -> plusieurs threads peuvent lire la meme valeur, ou tous lire la valeur finale(16); Resultat : sorties incorrects / pas vraiment deterministes(certains IDs manquent, d'autres répétes).*/ // Exercie 2 :