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.
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
 
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);
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.
Si le problème vous saute aux yeux... Merci.