Plan
- Gestion des erreurs de lecture
- Positionnement dans un flux
- Etat d’un flux
- Tri de tableau
- Tester ses programmes (V2)
Plan
Dans cet exercice nous allons vous demander de modéliser le fonctionnement d’une piscine. Les clients de la piscine sont des threads, nous vous demandons donc d’écrire le code de ces threads correspondant au comportement décrit dans la suite de l’énoncé.
Un baigneur doit :
Ressources critiques : certaines phases de ces activités mettent en jeu des ressources critiques, pour lesquelles les threads rentrent en compétitions :
Les phases de déshabillage et de rhabillage ne peuvent commencer que si certaines conditions sont réalisées :
Ces deux conditions sont donc éventuellement bloquantes.
Les fins des phases de déshabillage et de rhabillage ne sont pas bloquantes mais correspondent à la libération de ressources critiques :
Le code du baigneur peut être le suivant :
//arrivée
sleep (XXX) ;
// déshabillage
DebutDeshabiller();
sleep(XXX);
FinDeshabiller();
//baignade
sleep (XXX) ;
// rhabillage
DebutRhabiller() ;
sleep(XXX) ;
FinRhabiller() ;
//départ
sleep (XXX) ;
Ecrire le corps des fonctions : DebutDeshabiller (), FinDeshabiller (), DebutRhabiller () et FinRhabiller () selon les spécifications précédentes.
Coté lecteur :
T Lire ()
Mut.P();
T info = RetirerInfo ();
Mut.V ();
return info;
Coté rédacteur :
void Ecrire (const T & info)
Mut.P();
PoserInfo (info);
Mut.V();
Montrer que l’on peut obtenir un interblocage de processus.
La solution ci-dessous est inspirée de celle vue en cours, malheureusement elle n’est pas fonctionnelle. Dites pourquoi et corrigez la.
Indication : on donnera toujours priorité aux lecteurs par rapport aux rédacteurs.
Init : MutRedPresent = 0 ; MutRedEcr = 0 ; MutLect = 0;
Coté lecteur :
MutRedPresent.P ();
MutLect.P();
T info = RetirerInfo ();
MutLect.V ();
return info ;
Coté rédacteur :
MutRedEcr.P();
PoserInfo (info) ;
MutRedEcr.V();
MutRedPresent.V ();
Problème :
La situation est la suivante :
Un philosophe n’a que trois états possibles :
Des contraintes extérieures s’imposent à cette situation :
Le problème consiste à trouver un ordonnancement des philosophes tel qu’ils puissent tous manger, chacun à leur tour. Cet ordre est imposé par la solution que l’on considère comme celle de Dijkstra avec sémaphores ou Courtois avec des compteurs.
Le corps du processus philosophe peut être le suivant :
Philo(i)
{
while(true)
{
pense( );
prendre_fourchette( i );
manger ( );
poser_fourchette( i );
}
}
Conséquence, il faut écrire les fonctions prendre_fouchette () et poser_fourchette ().
On prend un sémaphore par fourchette (un mutex fait aussi l’affaire), chaque sémaphore est initialisé à 1.
sem fourch[ N ] = {1,........1}
prendre_fourchette (int i)
{
fourch[i].P() ;
fourch[(i+1)% N].P() ;
}
poser_fourchette (int i)
{
fourch[i].V() ;
fourch[(i+1)% N].V() ;
}
Monter que cette solution peut provoquer un interblocage de processus.
On modifie la solution 1 de sorte que les philosophes ne puissent pas prendre tous en même temps la fourchette de droite.
On introduit pour cela un sémaphore dont le compteur est égal à N-1
Implémenter cette solution.
C’est la même chose que la première solution sauf qu’un philosophe est gaucher et ceci afin d’éviter l’interblocage.
Implémenter cette solution.
On se centre ici sur les philosophes. Un sémaphore est attribué à chaque philosophe.
Etat = { PENSE , MANGE , A_FAIM}
Un philosophe qui veut prendre les fourchettes (donc manger) déclare qu’il a faim. Si l’un de ses deux voisins est en train de manger, il ne peut donc pas prendre les deux fourchettes pour l’instant et donc se met en attente. Si les deux philosophes à coté ne mangent pas alors il peut prendre les deux fourchettes et déclarer qu’il mange. Quand le philosophe a fini de manger, il déclare donc qu’il pense et regarde si ses deux voisins qui forcément ne pouvaient pas manger, en ont dès lors l’opportunité. Si c’est le cas il les réveille.
Implémenter cette solution.
Semaine du 29 mars.
Mardi 30/03 mot de passe Xenophon lien 913 4829 5689
Semaine du 5 avril.
Mardi 30/03 mot de passe Cyropedie
Numéro de réunion : 944 3386 5180
lien
Lien pour les soutenances (voir page ametice du dept) :
Ecrire les fonctions ci-dessous :
bool estPremier (const unsigned & i); vector <unsigned> nbPremiersAvantN (const unsigned & N);
La fonction estPremier () teste si l’entier passé en paramètre est un premier.
La fonction nbPremiersAvantN () renvoie dans un tableau, tous les nombres premiers plus petit que le paramètre.
Ecrire la fonction ci-dessous :
vector <unsigned> nbPremiersAvantN (const unsigned & N, vector<unsigned> & vLesPremiers, const unsigned & M);
Cette fonction ajoute au vecteur vLesPremiers tous les nombres premiers compris entre [N,M[.