TP threads
BCI ARSE


I. Les threads

I.1 Exercice 1 : fonctions de base

Cet exercice présente les fonctions pthread_create et pthread_join.

On vous demande d'abord de compléter, puis de compiler et d'exécuter le programme contenu dans le fichier Exo0.c .

Pour compiler : gcc -o Exo0 -Wall Exo0.c -lpthread

Le résultat de la commande Exo0 est un affichage du type :

------ Thr 1 (main) cree: 4 (i = 0)
------ Thr 1 (main) cree: 5 (i = 1)
------ Thr 1 (main) cree: 6 (i = 2)
------ Thr 1 (main) cree: 7 (i = 3)
------main Fin de main (1)

Pourquoi ne voit-on pas s'afficher les printf de la fonction Fonc1 ?

Copier le fichier Exo0.c dans un nouveau fichier appelé Exo1.c, modifier ce dernier en utilisant pthread_join et vérifier que les printf sont bien exécutés.

I.2 Exercice 2 : utilisation d'un sémaphore

On reprend le fichier Exo1.c.
On ne veut pas que plusieurs threads exécutent en même temps la boucle de Fonc1 : on va faire de cette boucle une section critique en l'encadrant d'opérations P (sem_wait dans la bibliothèque POSIX)) et V (sem_wait).

Copier le fichier Exo1.c dans un nouveau fichier appelé Exo2.c, modifier ce dernier en utilisant un sémaphore appelé Semaphore1, et vérifier que deux threads n'executent pas en même temps la boucle contenue dans Fonc1.

On pourra s'inspirer de ce programme incomplet pour écrire Exo2.c

Pour compiler :
gcc -o Exo2 -Wall Exo2.c -lpthread -lrt

I.3 Exercice 3 : utilisation de sémaphores

La fonction Fonc1 appelle à son tour une fonction Fonc2 qui utilise le même sémaphore. Recupérer ici . le fichier Exo3.c contenant le programme modifié.
Exécuter ce programme et constater le blocage sur le deuxième appel à sem_wait sur Semaphore1.

On veut éviter ce blocage en permettant à un thread qui est déja entré en section critique d'y entrer à nouveau.
Pour ce faire, on va écrire deux fonctions appelées EntrerSC et SortirSC qui permettent à un thread qui est deja entré en section critique d'y entrer à nouveau.
Ces deux fonctions sont rangées dans le fichier GererSC.c .
On vous demande de le compléter ainsi que le fichier Exo4.c .
Verifier le bon fonctionnement. : un thread qui est entré dans Fonc1 peut aussi entrer dans Fonc2.
Pour compiler : gcc -o Exo4 -Wall Exo4.c GererSC.c -lpthread lrt

Voici ce que font les fonctions EntreSC et SortirSC (les deux sémaphores sont initialisés ainsi : Init (S1,1) Init (S2,1)) :



/********** EntrerSC ***************/
void EntrerSC (void)
{

P(S1)
if (LeTid == pthread_self())	
   {
    Compteur = Compteur +1;
    V(S1)
   }
else
  {
   V(S1)
   P(S2)
   P(S1)
   LeTid = pthread_self();
   V(S1)
  }
}
/********** SortirSC ***************/
void SortirSC (void)
{
P(S1)
Compteur= Compteur - 1;
  if ( Compteur == 0)
     {
     LeTid = 0;
     Compteur = 0;
     V(S2);
     }
V(S1);
}

©(Copyright) dupouy@inf.enst.fr