Université de BBA 3ème année ISIL- 2022
SEII- TP2: Manipulation des Processus et Threads en langage C
Les moniteurs sous C-UNIX – Producteur – consommateur
1- En utilisant l’éditeur gedit, écrivez le programme suivant.
2- Compiler et exécuter ce programme – utiliser la commande CTL-C pour le terminer.
3- Expliquer le déroulement de ce programme
4- Proposer une solution pour arrêter ce programme en cinq unités de temps (sleep(5)).
#include <pthread.h> void *producer(void)
#include <semaphore.h> {
#include <stdlib.h> int msg;
#include <stdio.h> while(1) {
#include <unistd.h> msg = rand();
#define N 5 mettre(msg);
// Debut Moniteur }
}
pthread_mutex_t mutex ; void *consumer(void)
pthread_cond_t est_vide, est_plein; {
int buffer[N], ic =0 ,ip = 0,cpt = 0; int msg;
while(1) {
void mettre (int msg) msg = retirer();
{// section critique pour le dépôt }
pthread_mutex_lock( & mutex); }
if (cmp == N) pthread_cond_wait ( & est_plein, & mutex);
ip = (ip + 1) % N; void main (void){
buffer[ip] = msg; pthread_t ta;
printf("deposer [%i] : %i\n", ip,msg); pthread_t tb;
cpt = cpt + 1;
if (cpt == 1 ) pthread_cond_signal ( & est_vide);
pthread_mutex_unlock ( & mutex); pthread_mutex_init (&mutex, NULL);
} pthread_cond_init(& est_vide, NULL);
int retirer () pthread_cond_init (& est_plein, NULL);
{//section critique pour le retrait pthread_create(&ta, NULL, (void *)producer, NULL);
int result; pthread_create(&tb, NULL, (void *)consumer, NULL);
pthread_mutex_lock( & mutex); pthread_join(ta, NULL);
if(cmp == 0) pthread_cond_wait ( & est_vide, & mutex); pthread_join(tb,NULL);
ic = (ic + 1) % N; pthread_mutex_destroy(&mutex);
result = buffer[ic]; }
printf("retirer [%i]:%i \n",ic,result);
cpt--;
if (cpt == N-1) pthread_cond_signal( & est_plein);
pthread_mutex_unlock( & mutex);
return result;
}
//Fin moniteur
Solution : il suffit de rajouter une variable globale ‘int run’ initialisée à 1 puis ajouter les
instructions suivantes dans les bons emplacements dans le code.
sleep(5);
run = 0;
if(run == 0) pthread_exit(EXIT_SUCCESS);