Nowe posty

Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Pokaż wątki - vbvv

Strony: [1]
1
C/C++ / [C] 5 filozofów
« dnia: 2017-01-18, 19:54:16 »
Witam mam zadanie napisać program 5 filozofów za pomocą semaforów korzystając z treści rozwiązania i nim musze wykonać je:
"W rozwiązaniu wykorzystano 5-el tablice binarnych semaforów sem[5]- każdy semafor jest związany z jednym widelcem i jest inicjowany wartością 1. pseudokod procedury każdego filozofa:
begin
repeat
     myslenie;
     wait(sem[name]);
     wait(sem[(name+1)mod 5]);
     jedzenie;
     signal(sem[name]);
     signal(sem[(name+1)mod 5]);
end

Czy moje rozwiazanie tego problemu jest poprawne? Prosiłbym o ewentualne wskazówki.
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/errno.h>
#include <fcntl.h>

#define N 5 //ilosc semaforow

int alokujSemafor(key_t klucz, int number, int flagi);
void inicjalizujSemafor(int semID, int number, int val);
int waitSemafor(int semID, int number, int flags);
void signalSemafor(int semID, int number);
int zwolnijSemafor(int semID, int number);
void myslenie(int);
void jedzenie(int);

int main()
{
key_t klucz;
int sem;
int i;

//tworzymy N=5 semeforow
sem=alokujSemafor(klucz,N,IPC_CREAT|IPC_EXCL|0666);
for(i=0;i<N;i++)
inicjalizujSemafor(sem,i,1);// inicjalizujemy jedynkami

printf("Semafory gotowe!\n");
fflush(stdout);

for(i=0;i<N;i++)
{
myslenie(i);
waitSemafor(sem,i,0);
waitSemafor(sem,(i+1)%5,0);
jedzenie(i);
signalSemafor(sem,i);
signalSemafor(sem,(i+1)%5);
}
printf("Wykonano poprawnie !\n");
zwolnijSemafor(sem,N);

}

void myslenie(int i)
{
printf("Filozof nr: %d mysli...\n",i+1);
sleep(1);
}

void jedzenie(int i)
{
printf("Filozof nr: %d je...\n",i+1);
sleep(1);
}

int alokujSemafor(key_t klucz, int number, int flagi)
{
   int semID;
   if ( (semID = semget(klucz, number, flagi)) == -1)
   {
      perror("Blad semget (alokujSemafor): ");
      exit(1);
   }
   return semID;
}

void inicjalizujSemafor(int semID, int number, int val)
{
   
   if ( semctl(semID, number, SETVAL, val) == -1 )
   {
      perror("Blad semctl (inicjalizujSemafor): ");
      exit(1);
   }
}

int waitSemafor(int semID, int number, int flags)
{
   int result;
   struct sembuf operacje[1];
   operacje[0].sem_num = number;
   operacje[0].sem_op = -1;
   operacje[0].sem_flg = 0 | flags;//SEM_UNDO;
   
   if ( semop(semID, operacje, 1) == -1 )
   {
      //perror("Blad semop (waitSemafor)");
      return -1;
   }
   
   return 1;
}

void signalSemafor(int semID, int number)
{
   struct sembuf operacje[1];
   operacje[0].sem_num = number;
   operacje[0].sem_op = 1;
   //operacje[0].sem_flg = SEM_UNDO;

   if (semop(semID, operacje, 1) == -1 )
      perror("Blad semop (postSemafor): ");

   return;
}
int zwolnijSemafor(int semID, int number)
{
   return semctl(semID, number, IPC_RMID, NULL);
}

Strony: [1]