Bonjour,
Je code l'algo de rendez vous de N processus (sur une recette de cuisine...). J'ai donc un mutex pour protéger la variable commune qui compte les processus arrivés et un sémaphore initialisé à 0 pour endormir les processus qui arrivent à la barrière.
Et ce sémaphore ne bloque rien.
nb_arrives est la variable commune protégée par semid_mutex. J'ai 3 processus qui ont chacun un temps d'exécution différent et dans le if(), je vois les printf qui s'enchaînent l'un derrière l'autre sans blocage. Apparemment, semid_s ne joue pas son rôle quand je fais -1 dessus.Code:
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 if(tab_fils[i] == 0) { //premier travail de préparation preparation(i); //arrivée à la barrière operations_mutex.sem_op = -1; semop(semid_mutex, &operations_mutex, 0); //-1 sur mutex memcpy(&nb_arrives, ptr_shm, sizeof(int)); nb_arrives += 1; //incrémenter le nombre de processus arrivés memcpy(ptr_shm, &nb_arrives, sizeof(int)); if(nb_arrives < NB_FILS) { operations_mutex.sem_op = 1; semop(semid_mutex, &operations_mutex, 0); //+1 sur mutex (on le rend) printf("%d processus %d arrive(s) Blocage\n", nb_arrives, i); operations_s.sem_op = -1; semop(semid_s, &operations_s, 0); //-1 sur s operations_s.sem_num = 0; operations_s.sem_flg = 0; printf("Fin du blocage\n"); } else { operations_mutex.sem_op = 1; semop(semid_mutex, &operations_mutex, 0); //+1 sur mutex printf("Reveiller tous les processus arrives.\n"); for(j=0; j<nb_arrives-1; j++) { printf("Reveil du fils %d\n",i); operations_s.sem_op = 1; semop(semid_s, &operations_s, 0); //+1 sur s operations_s.sem_num = 0; operations_s.sem_flg = 0; } sleep(5); } //barrière franchie, on continue cuisson(i);
Si le problème vous saute aux yeux... Merci.