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.
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
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