Université Pierre et Marie Curie Master 2016 2017
PR : Travaux Dirigés 5. Processus légers et fichiers

Cette séance étudie l’utilisation des Threads avec des fichiers. On rappelle que selon les systèmes, la bibliothèque Pthread n’est pas toujours automatiquement trouvée par le compilateur, et qu’il faudra alors utiliser le Makefile ainsi :

LDFLAGS=’-lpthread’ make but

ou le modifier pour donner systématiquement cette valeur à LDFLAGS.



Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

Warning: fsockopen(): unable to connect to ssl://www-master.ufr-info-p6.jussieu.fr:8083 (Connection refused) in /dsk/www-master/html/2016/ecrire/inc/distant.php on line 699

1 N Threads pour N fichiers

On considère la fonction (on trouvera en annexe un fichier C la contenant que le Makefile fourni s’attend à trouver dans le sous-répertoire src) qui fait passer en majuscules toutes les minuscules d’un fichier :

Ecrire un programme C prenant plusieurs noms de fichiers en argument. Il doit créer autant de Threads que de fichiers, et les lancer en parallèle. La i-ème Thread créée doit appliquer la fonction ci-dessus sur le i-ème fichier de la liste des fichiers, et transmettre au programme principal le résultat de cette fonction. Le programme principal attend la terminaison de chaque Thread et teste son retour. S’il n’est pas nul, il affiche le nom du fichier posant problème sur le flux de sortie. Au final, le programme sort avec comme code de retour le nombre de fichiers qui ont posé problème (donc 0 si tout c’est bien passé).

Exemple d'appel :
bin/thread_upper fichier1 fichier2 fichier3 fichier4
Fichier à créer : src/thread_upper.c

2 N fichiers , N-K Threads

On considère maintenant que le nombre de threads créées est inférieur au nombre de fichiers à traiter. Dès qu’une Thread a converti un fichier avec succès, elle doit passer à un autre fichier s’il en reste, et sinon se terminer. Si un fichier pose problème, elle se termine tout de suite en indiquant le fichier fautif au programme principal.

Ecrire un nouveau programme C programmant cette stratégie, le premier argument sur la ligne de commande étant le nombre de Thread permis, les suivants étant les fichiers, en nombre supérieur. Le programme principal doit attendre la fin des Threads, tester leur retour et afficher les fichiers ayant posé problème. On notera qu’il peut y avoir des fichiers non examinés si toutes les Threads ont rencontré un fichier à problème.

Exemple d'appel :
bin/thread_uppermax 2 fichier1 fichier2 fichier3
Fichier à créer : src/thread_uppermax.c

3 Un producteur et un consommateur

Nous voulons faire communiquer une thread Producteur et une thread Consommateur en utilisant une pile de taille fixe (un tableau de 100 caractères). Les valeurs empilées sont des caractères. La thread Producteur utilise la fonction Push() pour empiler un caractère au sommet de la pile et la thread Consommateur utilise la fonction Pop() pour désempiler une valeur du sommet de la pile. Une variable globale stack_size contrôle le sommet de la pile.

Programmez les fonctions Push() et Pop() décrites ci-dessus pour faire communiquer les threads Producteur et Consommateur, le corps de ces deux fonctions reposant respectivement sur les deux séquences de code définies par les deux macros suivantes, fournies dans le fichier .h en annexe :

Ecrire ensuite le programme main utilisant ces deux fonctions.

Exemple d'appel :
echo "123456789" | bin/producteur_consommateur
Fichier à créer : src/producteur_consommateur.c

4 Des producteurs et des consommateurs

Reprenez l’exercice précédent en faisant échanger plusieurs producteurs et plusieurs consommateurs de façon concurrente, toujours à travers une seule pile. Votre programme prendra en argument deux nombres : le nombre de producteurs suivi du nombre de consommateurs.

Exemple d'appel :
echo "123456789" | bin/producteurs_consommateurs 5 3
Fichier à créer : src/producteurs_consommateurs.c

5 Annexes


makefile

producteur_consommateur.h

lib_upper.c
Format de l'envoi : src/thread_upper.c
Répertoires autorisés : src/thread_uppermax.c src/producteur_consommateur.c src/producteurs_consommateurs.c