0% ont trouvé ce document utile (0 vote)
227 vues1 page

Les Moniteurs Sous C-UNIX - Producteur - Consommateur: // Debut Moniteur

Ce document présente un exemple de programme C implémentant un producteur-consommateur avec des threads et des moniteurs. Le programme utilise des mutex, conditions et tampons circulaires pour synchroniser les threads producteur et consommateur. Une solution est proposée pour arrêter le programme après 5 unités de temps.

Transféré par

BENYAHIA NESRINE
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
227 vues1 page

Les Moniteurs Sous C-UNIX - Producteur - Consommateur: // Debut Moniteur

Ce document présente un exemple de programme C implémentant un producteur-consommateur avec des threads et des moniteurs. Le programme utilise des mutex, conditions et tampons circulaires pour synchroniser les threads producteur et consommateur. Une solution est proposée pour arrêter le programme après 5 unités de temps.

Transféré par

BENYAHIA NESRINE
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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);

Vous aimerez peut-être aussi