Bonsoir,
j'ai un problème, mon programme boucle sur entre dans une cabine et se change mais je ne comprend pas pourquoi, pouvez vous m'aider?

Ensuite quand je fais l'opération V(), quel est le thread débloqué, le premier qui a était bloqué ou le dernier?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
}
Merci d'avance pour votre aide.