Previous Up Next

2  Exclusion mutuelle


Exercice 3
 (Compteur)   Il s’agit de développer une version « MT-Safe » de la fonction suivante de gestion d’un compteur (par exemple un compteur du nombre d’appel...).
int 
count_me(int i) 
{
    static int count = 0; /* variable globale à visibilité locale */
  
    count += i; 
  
    return count; 
}
Question 1   Quel problème peut survenir lors de l’utilisation de cette fonction dans un programme multithreadé ?
Question 2   Quelle structure utiliser pour protéger les accès à count ?
Question 3   Comment retourner la valeur de count ?

Exercice 4
 (Retour sur l’arbre de calcul)   On propose d’améliorer la solution de l’exercice 1 de calcul du ne nombre de Fibonacci de la manière suivante : plutôt que de créer un processus léger alors que la valeur a déjà été produite auparavant par un autre processus léger, on va récupérer cette valeur. Pour cela, on garde les résultats intermédiaires produits dans un tableau partagé entre les threads. (Les éléments de ce tableau sont par exemple initialisés à la valeur INCONNUE pour dénoter que la valeur n’a pas encore été calculée.)
#define INCONNUE       -1
static int fibtab []; 
Proposez un mécanisme pour assurer le partage des accès à ce tableau fibtab entre tous les processus légers. Donnez la nouvelle implémentation de la fonction fib().

Squelette d’un serveur de chat multithreadé

Les fichiers sources d’un squelette de serveur de chat multithreadé sont accessibles dans cette archive. Vous y trouverez :

La version fournie de la fonction manage_cnct() n’est pas multithreadée ; la connexion d’un client bloque le serveur...

Seul le fichier cnct.c est à modifier. Vous fournirez aussi des fichiers stat.h et stat.c pour la gestion des statistiques.

Il est possible d’activer la production de traces d’exécution du serveur par l’option -v. Utilisez les fonctions pgrs*() pour ce faire.

Utilisation du serveur de chat multithreadé

Au démarrage du serveur, le numéro du port d’écoute est affiché :

% ./mtcs
Server open on port 8012
...

il faut repérer ce numéro de port d’écoute (ici 8012), il faut aussi identifier aussi le nom de la machine ! (localhost pour la machine locale peut suffire).

On peut alors lancer des clients. Depuis un autre terminal :

% telnet localhost 8012
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
mtcs : bienvenu
foooooooooooooooo
foooooooooooooooo
FOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooo.............
FOOOOOOOOOOOOOOOOooooooooooooooooooooooooooooooo.............

on termine par control-] puis quit:

^]
telnet> quit
Connection closed.


Exercice 5
 (Serveur de chat)   Un serveur de chat multithreadé est basé sur le principe suivant : Dans une version initiale non multithreadée, l’implémentation de manage_cnct() repose sur un simple appel à repeater().
Question 1   Donnez une implantation de la fonction manage_cnct() déléguant à un thread l’appel à la fonction.

On se préoccupera aussi de la terminaison de ce thread.

Question 2   Quelle structure de données doit être partagée entre les threads pour réaliser cette répétition des flux d’entrée ? Identifiez les accès qui seront réalisés à cette structure de données. Comment les protéger ?

On désire ajouter le maintien de statistiques au serveur de chat. Les informations suivantes seront mémorisées :

De plus, on désire pouvoir interroger le serveur sur ces statistiques en lui envoyant un signal SIGUSR1

Question 3   Comment garder et mettre à jour ces informations de statistiques ?
Question 4   Pourquoi est-il dangereux de contrôler par un verrou mutex POSIX l’accès partagé aux informations de statistiques entre les threads produisant ces statistiques et le handler de signaux affichant ces statistiques ?
Question 5   Implantez cette prise de statistiques et leur affichage.

Previous Up Next