PROFDINFO.COM

Votre enseignant d'informatique en ligne

LE DISTRIBUTEUR DE BOISSONS

Laboratoire d'initiation aux pthreads

Objectifs

Ce laboratoire comporte un objectif en deux volets: d'abord, une familiarisation avec l'environnement de développement intégré Momentics (création d'un projet, édition, compilation, etc.), ensuite, une initiation aux contraintes de la programmation multitâche sous Neutrino à l'aide des threads POSIX (pthreads).

Description

Il s'agit de faire coopérer un ensemble de threads simulant un distributeur de boissons. Le thread principal (fonction main) affiche un choix de boissons (pour simplifier l'exercice, nous supposerons que toutes les boissons sont au même prix). Lorsqu'un client se présente, il peut soit entrer des pièces à volonté (5 cents, 10 cents, 25 cents et 1 dollar), soit faire son choix parmi les boissons offertes. Au moment de faire son choix, un montant égal ou supérieur au prix de la boisson doit avoir été fourni à la machine, autrement, le choix du client est ignoré (et n'est pas mémorisé). Si le montant nécessaire a été fourni, deux threads sont immédiatement lancés: le premier sera responsable du calcul et de la remise de la monnaie au client, le second se chargera de la fabrication de la boisson.

Le premier de ces deux threads (fonction calculer_monnaie), calcule le nombre de pièces de 5 cents, 10 cents, 25 cents et 1 dollar à remettre au client, et les affiche l'une après l'autre. Pour simuler un vrai (vieux) distributeur, on fait dormir le thread pendant 800 ms avant la remise de chaque pièce.

Le deuxième de ces threads (fonction fabriquer_boisson), simule la "fabrication" de la boisson en affichant un message après un sommeil de 1500 ms. Encore une fois, pour simuler un vrai distributeur (comme ceux que l'on pouvait voir au collège il y a quelques années), une panne majeur survient une fois sur dix lors de la fabrication de la boisson. Dans un tel cas, la boisson n'est pas livrée, un message d'erreur est affiché, et le programme se termine.

Directives particulières

Vous ne devez pas utiliser de variables globales (ça vous le saviez).

Utilisez le plus souvent possible des constantes.

N'UTILISEZ JAMAIS DES NOMBRES RÉELS POUR FAIRE DES CALCULS SUR DE L'ARGENT. Afin d'éviter l'imprécision de ceux-ci, utilisez des nombres entiers et faites les opérations sur des cents. Utilisez les entrées-sorties avec lesquelles vous êtes le plus confortable (celles de C ou celles de C++).

Vous devez offrir au moins cinq boissons, pour lesquelles il faut entrer les commandes a à e (voir les exemples plus loin). Une commande cachée (z) permet de mettre fin au programme.

Le prix des boissons (le même pour toutes) doit être passé en paramètre sur la ligne de commande.

L'exécution doit être testée dans une fenêtre de terminal.

Vous aurez besoin des fonctions suivantes: thread_create(), pthread_attr_init(), pthread_attr_setdetachstate(), pthread_attr_destroy(), pthread_join(), pthread_exit(), delay(), rand(), srand(), time(). Les trois dernières fonctions sont utilisées pour générer des nombres aléatoires dans la simulation des pannes.

Correction

Vous avez une semaine pour compléter ce travail et le faire vérifier par votre enseignant pendant les périodes de laboratoire. Ce travail peut être fait en équipe de deux.

Quelques exemples d'exécution

Démarrage du programme avec un prix de 80 cents par boisson:

/home/bob/workspace/labo1/x86/o-g> ./Distributeur_g 80

À mesure que des pièces sont entrées, le montant est ajusté:

Distributeur de boissons
Montant entre: $0,50
(a) Cafe froid
(b) Shooter cheap
(c) Dry Martini
(d) Quick aux fraises
(e) Jus de carottes

Après avoir entré un total de un dollar, on entre e pour un jus de carotte. Le montant est remis à zéro, puis, la monnaie nous est rendue parallèlement à la livraison de la boisson. Seule véritable entorse à la réalité, il faut appuyer sur la touche enter pour continuer:

Distributeur de boissons
Montant entre: $0,00
(a) Cafe froid
(b) Shooter cheap
(c) Dry Martini
(d) Quick aux fraises
(e) Jus de carottes
$0,10
Votre boisson est servie
$0,10
<enter> pour continuer

Simulation d'une panne. Le distributeur rend la monnaie, mais pas la boisson:

Distributeur de boissons
Montant entre: $0,00
(a) Cafe froid
(b) Shooter cheap
(c) Dry Martini
(d) Quick aux fraises
(e) Jus de carottes
$0,10
Erreur. Veuillez appeler un reparateur.
$0,10
/home/bob/workspace/labo3/x86/o-g>