Les threads
Ce qu'est un thread et ce qui le distingue d'un processus, ce que les threads partagent ou non, les appels pthread_create et pthread_join, et la situation de course quand deux threads touchent une même variable.
- 27 cartes
- 4 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
Quelques cartes du deck
Thread : de quoi s'agit-il ?
Voir la réponse
Fil d'exécution à l'intérieur d'un processus : il a sa propre pile et ses propres registres, mais partage la mémoire et les fichiers ouverts du processus avec les autres.
Créer un thread coûte moins qu'un processus et les threads communiquent sans copie, mais cet accès commun est la source des situations de course.
Deux threads partent d'un compteur à 0. Chacun fait lire, ajouter, écrire. L'ordre est : T1 lit, T2 lit, T1 écrit, T2 écrit. Que vaut le compteur à la fin ?
- 1
- 0
- 2
- 3
Voir la réponse
1
T1 et T2 lisent tous deux 0, ajoutent 1 et écrivent 1 : la deuxième écriture écrase la première. Une mise à jour est perdue, alors qu'avec un ordre T1 complet puis T2 complet on aurait obtenu 2.
Chaque thread possède sa propre …, mais tous les threads d'un processus partagent le … et les variables globales.
Voir la réponse
Chaque thread possède sa propre pile, mais tous les threads d'un processus partagent le tas et les variables globales.
Les variables locales vivent sur la pile : chaque thread a les siennes. Le tas et les globales sont communs à tout le processus.
Situation de course : de quoi s'agit-il ?
Voir la réponse
Défaut où le résultat dépend de l'ordre dans lequel des threads accèdent à une donnée partagée, dont l'un au moins la modifie.
Elle n'apparaît pas à chaque exécution, ce qui la rend difficile à reproduire. Deux threads qui font chacun 100 000 fois
compteur++, compilés sans optimisation sur une machine à plusieurs cœurs, donnent presque toujours moins de 200 000.Quatre threads sont créés dans une boucle avec
pthread_create(&t[i], NULL, f, &i). Chacun affiche*arget on observe parfois4 4 4 4. Quelle est la cause, et la correction ?- Les threads s'exécutent en série, l'un après l'autre ; ajouter un
pthread_joindans la boucle de création pthread_createest trop lent pour la boucle ; créer plutôt des processus avecfork- Tous lisent le même
i, déjà avancé ; passer l'adresse d'une copie distincte par thread - Chaque thread a sa pile, donc
iest copié à la création ; déclarerienstatic
Voir la réponse
Tous lisent le même
i, déjà avancé ; passer l'adresse d'une copie distincte par thread&iest l'adresse d'une variable demain, partagée par tous. Chaque thread lit la valeur qu'aià cet instant, de 0 à 4 selon l'avancée de la boucle. Il faut une case par thread, commeint id[4]avec&id[i], sans la modifier ensuite.staticne change rien : toujours une seule case.- Les threads s'exécutent en série, l'un après l'autre ; ajouter un