ESIEE E3 : IGI-3004 

Systèmes d'exploitation - UNIX

TD-Machine : Threads et synchronisation avec sémaphores

Objectifs

  1. Mettre en oeuvre des programmes multithreadés
  2. Mettre en oeuvre des mécanismes de synchronisation de programmes multithreadés reposant sur les sémaphores

Remarques préliminaires

I - Threads, données partagées et synchronisation de threads

Afin de paralléliser les traitements il est souvent intéressant de diviser un programme en plusieurs threads. Dans cet exercice, on considère le cas d'un serveur devant transmettre des messages. On trouvera un (ou plusieurs) thread(s) pour lire dans une (ou plusieurs) source(s) et un (ou plusieurs threads) chargé(s) de transmettre des données. Dans ce contexte les threads chargés de la lecture et ceux chargés de l'écriture doivent partager une zone de la mémoire. On a donc le schéma simplifié suivant :

threads

L'objectif de cet exercice est d'implanter le schéma ci-dessus. L'étape 1 du thread 1 et l'étape 2 du thread 2 seront réalisées avec la bibliothèque permettant de lire et écrire des lignes dans un fichier implémentée lors du TD-machine 1 de l'unité de systèmes d'exploitation. Lors de ce TD vous avez ainsi du obtenir deux fichiers sources qui ressemblent fortement à ceux-ci : gestionFichiers.c et gestionFichiers.h . La source sera le fichier texte suivant Source.txt et la destination sera un fichier texte Destination.txt .

I.A - Implantez le schéma ci-dessus. La mémoire partagée sera un pointeur vers une chaîne de caractères déclaré comme variable globale par : 'char *c;'.

I.B - Quel est le problème de la solution A ? Proposez (sans l'implémenter) un schéma de solution au problème de A.

Remarque importante : Pour compiler un programme qui se sert des threads, il faut utiliser la commande 'gcc -lpthread'.

II - Threads concurrents

On a 3 threads P1, P2, et P3 concurrents. Le code indépendant de chaque thread Pi (i=1,2,3) est le suivant :

for(j = 0; j < 10; j++)

printf("Affichage %d du thread %d\n", j+1, i); // Thread Pi avec i = 1, 2, 3

II.A - Indiquez comment synchroniser les threads P1, P2 et P3 avec des sémaphores pour obtenir l'affichage suivant :

Affichage 1 du thread 1
Affichage 1 du thread 2
Affichage 1 du thread 3
Affichage 2 du thread 1
Affichage 2 du thread 2
Affichage 2 du thread 3
Affichage 3 du thread 1
Affichage 3 du thread 2
Affichage 3 du thread 3
...

II.B - Programmez la solution décrite à la question précédente.

Ce sujet a été élaboré par Jean COUSTY et Laurent NAJMAN
Laboratoire d'Informatique Gaspard-Monge, Université Paris-Est - Département Informatique, ESIEE Paris