Station MinuitPortail personnel de révision

IFT-2001 — Systèmes d’exploitationAutomne 2026

Semaine 4 — Threads

5. Terminaison, jointure et ordre d’exécution

LECTURE 08 / 194 repères · 1 captureSynthèse avec omissions acceptées

5. Terminaison, jointure et ordre d’exécution

Sur le terrain / Capture LinuxS04-JOIN
Attendre le résultat avec join. Avant la libération, le thread est vivant et la liste de résultats est vide.
Attendre le résultat avec join

Un événement retient d’abord le travail. Après sa libération et join, le thread a terminé et la valeur produite est disponible.

  • Avant la libération, le thread est vivant et la liste de résultats est vide.
  • join attend la terminaison du thread ciblé; cet exemple utilise l’API Python, distincte de pthread_join.
Lire la capture en texte
thread.start()
libération du travail ; thread.join()

Avant libération : thread vivant = True ; résultat = []
Après join() : thread vivant = False ; résultat = [42]

Démonstration Station Minuit · Ubuntu 24.04 / WSL2 · Python 3 · 15 octobre 2026 (Toronto). Sortie réelle remise en page et capturée; exemple ajouté, distinct du matériel officiel.

5.1 pthread_join

Code (c) · sélectionner pour copier

int pthread_join(pthread_t tid, void **status);

pthread_join bloque le thread appelant jusqu’à la terminaison du thread tid. status peut recevoir la valeur finale; NULL indique qu’elle n’est pas requise. Le tutoriel LLNL rappelle qu’un thread joignable ne doit être joint qu’une fois. Un thread détaché libère automatiquement ses ressources de terminaison, mais ne peut pas être joint.

join exprime une relation logique : « poursuivre après la fin de ce thread ». sleep exprime seulement une attente temporelle. Une pause d’une seconde ne prouve pas que le travail est fini; la charge et l’ordonnancement peuvent toujours modifier la durée réelle.

Le créateur qui poursuit sans attendre produit une relation asynchrone. Lorsqu’il joint un travailleur avant de dépendre de son résultat, la relation devient synchrone sur cette terminaison.

5.2 Préserver ou détruire la concurrence

Patron concurrent :

  1. créer tous les travailleurs;
  2. les laisser progresser;
  3. joindre ensuite chacun d’eux.

Patron sérialisé :

  1. créer un travailleur;
  2. le joindre immédiatement;
  3. seulement ensuite créer le suivant.

Le deuxième patron peut être voulu lorsqu’une dépendance séquentielle existe, mais il annule le parallélisme si les travailleurs étaient censés avancer ensemble.

5.3 Lire une trace correctement

Il faut distinguer quatre ordres :

  • l’ordre dans lequel le programme appelle pthread_create;
  • l’ordre de démarrage réel des travailleurs;
  • l’ordre des opérations observables comme les affichages;
  • les relations de précédence garanties par les join ou d’autres primitives.

Une trace obtenue une fois n’est pas une spécification. L’ordonnanceur peut choisir un ordre différent à l’exécution suivante.

Dans l’exemple A/B/C, A et B sont créés ensemble et leurs affichages peuvent s’entrelacer. Le thread principal joint A et B avant de créer C. La garantie est donc uniquement : C commence après la fin de A et de B. Aucun ordre relatif complet n’est imposé entre A et B.

Retour au sommaire de l’unitéHaut de page
Récupérer manuellement les données locales

Copier séparément les données ci-dessous dans des fichiers texte avant de fermer la page ou de modifier le stockage. Une valeur illisible ou incompatible reste en place. Aucun effacement ni rétablissement écrasant n’est effectué automatiquement. L’export/import JSON est disponible sur la page Progression du cours. Cette récupération séparée reste utile pour une valeur brute ou un conflit.

Clé de ce cours : . Format v1 porté par cette clé; dates UTC et identifiants durables.

Si l’accès est refusé, la valeur persistée peut rester inaccessible. Réautoriser le stockage dans le navigateur puis rouvrir ce cours permet de la relire. Une réinitialisation exige une décision explicite après récupération; aucune commande de suppression n’est proposée ici. Les données restent sur cette origine et cet appareil, sans transfert automatique.