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.

  1. Notions
  2. Questions
  3. Ranger et relier
  4. 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 *arg et on observe parfois 4 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_join dans la boucle de création
    • pthread_create est trop lent pour la boucle ; créer plutôt des processus avec fork
    • Tous lisent le même i, déjà avancé ; passer l'adresse d'une copie distincte par thread
    • Chaque thread a sa pile, donc i est copié à la création ; déclarer i en static
    Voir la réponse

    Tous lisent le même i, déjà avancé ; passer l'adresse d'une copie distincte par thread

    &i est l'adresse d'une variable de main, partagée par tous. Chaque thread lit la valeur qu'a i à cet instant, de 0 à 4 selon l'avancée de la boucle. Il faut une case par thread, comme int id[4] avec &id[i], sans la modifier ensuite. static ne change rien : toujours une seule case.