1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
|
/*
Une piscine, un nombre maxCabines (P) de cabines, un nombre maxCasiers (N) de casiers et un nombre maxNageurs (M) de baigneurs !!! Pour aller dans l'eau Il faut prendre un casier, puis on se dirige vers une cabine qu'on occupe un certain temps, on va dans la piscine un autre certain temps, on réoccupe une cabine pendant un certain temps, puis on rend le casier à la fin
*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <semaphore.h>
#define MAXNAGEURS 10
#define MAXCABINES 5
#define MAXCASIERS 15
sem_t verrouCasier;
sem_t verrouNageur;
sem_t verrouCabine;
void nage(int nageur){
sem_wait(&verrouNageur);
sleep(4);
printf("nageur %d nage\n",nageur);
sem_post(&verrouNageur);
}
void occupeCasier(int nageur){
sem_wait(&verrouCasier);
printf("nageur %d occupe un casier\n",nageur);
}
void libereCasier(int nageur){
sem_post(&verrouCasier);
printf("nageur %d libere un casier\n",nageur);
}
void seChange(int nageur){
sem_wait(&verrouCabine);
sleep(2);
printf("nageur %d entre dans une cabine et se change\n",nageur);
sem_post(&verrouCabine);
}
void seRhabille(int nageur){
sem_wait(&verrouCabine);
sleep(2);
printf("nageur %d entre dans une cabine et se rhabille\n",nageur);
sem_post(&verrouCabine);
}
void* piscine(void *data){
int i=(int)data;
seChange(i);
occupeCasier(i);
nage(i);
seRhabille(i);
libereCasier(i);
}
int main(void){
pthread_attr_t t;
int i;
srand(time(NULL));
sem_init(&verrouCabine,1,MAXCABINES);
sem_init(&verrouCasier,1,MAXCASIERS);
sem_init(&verrouNageur,1,MAXNAGEURS);
pthread_attr_init(&t);
pthread_attr_setdetachstate(&t,PTHREAD_CREATE_DETACHED);
for(i=0;;i++){
pthread_t nageur;
pthread_create(&nageur,&t,&piscine,(void*)i);
}
return 0;
} |
Partager