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