philosophen
-
hi leute ich wollte das problem mit den speisenden philosophen realisieren:
#include <stdio.h> #include <pthread.h> #include <time.h> #define LIVE 10000 enum bool {FALSE, TRUE}; int gabel[5] = {FALSE, FALSE, FALSE, FALSE, FALSE}; int teller[5] = {FALSE, FALSE, FALSE, FALSE, FALSE}; /*prototypen*/ void philosoph(int); void eat(); /*end prototypen*/ void eat(){ time_t start, stop; double diff; start=time(NULL); while((diff=difftime(stop, start)) != 1){ stop=time(NULL); }//end while }//end eat void philosoph(int name){ int gelebt; int fetz; int freierplatz; int freiegabeln[2]; printf("Philosoph: %d beginnt sein leben es wird %d Jahre lang sein\n", name, LIVE); while(gelebt <= LIVE){ printf("Philosoph %d prüft ob platz vorhanden\n", name); while(fetz <= 4){ if(teller[fetz] == FALSE){ printf("Philosoph %d erklaert seinen Platz für besetzt\n", name); teller[fetz] = TRUE; break; }//end if }//end while printf("Philosoph %d prüft welche zwei gabeln neben seinem teller Liegen\n", name); switch(fetz){ case 0: freiegabeln[0]= 0; freiegabeln[1]= 1; break; case 1: freiegabeln[0]= 1; freiegabeln[1]= 2; break; case 2: freiegabeln[0]= 2; freiegabeln[1]= 3; break; case 3: freiegabeln[0]= 3; freiegabeln[1]= 4; break; case 4: freiegabeln[0]= 4; freiegabeln[1]= 0; break; }//end switch printf("Philosoph %d prüft ob die Zwei gabeln Vorahnden\n", name); if(gabel[freiegabeln[0]] == FALSE && gabel[freiegabeln[1]] == FALSE){ printf("Philosoph %d nimmt seine gablen,", name); gabel[freiegabeln[0]] = TRUE; gabel[freiegabeln[1]] = TRUE; printf("und isst\n"); wait(); printf("Philosoph %d ist fertig und gibt seinen Platz frei\n", name); teller[fetz] == FALSE; freiegabeln[0]= 0; freiegabeln[1]= 0; fetz = 0; }else{ printf("Philosoph %d gibt seinen Platz frei\n", name); teller[fetz] == FALSE; freiegabeln[0]= 0; freiegabeln[1]= 0; fetz = 0; }//end if printf("Philosoph %d wird aelter\n", name); gelebt++; }//end while }//end philosoph int main (void){ pthread_t p0, p1, p2, p3, p4; pthread_create (&p0, NULL, philosoph, 1); pthread_create (&p1, NULL, philosoph, 2); pthread_create (&p2, NULL, philosoph, 3); pthread_create (&p3, NULL, philosoph, 4); pthread_create (&p4, NULL, philosoph, 5); pthread_join (p0, NULL); pthread_join (p1, NULL); pthread_join (p2, NULL); pthread_join (p3, NULL); pthread_join (p4, NULL); return 0; }//end main
aber der code verklemmt sich immer ich bekomme folgende ausgaben:
Philosoph: 1 beginnt sein leben es wird 10000 Jahre lang sein Philosoph: 2 beginnt sein leben es wird 10000 Jahre lang sein Philosoph 2 prüft ob platz vorhanden Philosoph 2 erklaert seinen Platz für besetzt Philosoph 2 prüft welche zwei gabeln neben seinem teller Liegen Philosoph 2 prüft ob die Zwei gabeln Vorahnden Philosoph 2 nimmt seine gablen,und isst Philosoph 2 ist fertig und gibt seinen Platz frei Philosoph 2 wird aelter Philosoph 2 prüft ob platz vorhanden Philosoph: 3 beginnt sein leben es wird 10000 Jahre lang sein Philosoph 3 prüft ob platz vorhanden Philosoph: 4 beginnt sein leben es wird 10000 Jahre lang sein Philosoph 4 prüft ob platz vorhanden Philosoph: 5 beginnt sein leben es wird 10000 Jahre lang sein Philosoph 5 prüft ob platz vorhanden
ich versteh das nicht vielleicht könnt ihr mir da helfen das waere super!!!
-
-
ich hab nun nen fehler gefunden und meinen code folgendermaßen abgeaendert:
#include <stdio.h> #include <pthread.h> #include <time.h> #define LIVE 10000 enum bool {FALSE, TRUE}; int gabel[5] = {FALSE, FALSE, FALSE, FALSE, FALSE}; int teller[5] = {FALSE, FALSE, FALSE, FALSE, FALSE}; /*prototypen*/ void philosoph(int); void eat(); /*end prototypen*/ void eat(){ time_t start, stop; double diff; start=time(NULL); while((diff=difftime(stop, start)) != 1){ stop=time(NULL); }//end while }//end eat void philosoph(int name){ int gelebt; int fetz; int freierplatz; int freiegabeln[2]; // printf("Philosoph: %d beginnt sein leben es wird %d Jahre lang sein\n", name, LIVE); while(gelebt <= LIVE){ // printf("Philosoph %d prüft ob platz vorhanden\n", name); while(fetz <= 4){ if(teller[fetz] == FALSE){ // printf("Philosoph %d erklaert seinen Platz für besetzt\n", name); teller[fetz] = TRUE; break; }//end if fetz++; }//end while // printf("Philosoph %d prüft welche zwei gabeln neben seinem teller Liegen\n", name); switch(fetz){ case 0: freiegabeln[0]= 0; freiegabeln[1]= 1; break; case 1: freiegabeln[0]= 1; freiegabeln[1]= 2; break; case 2: freiegabeln[0]= 2; freiegabeln[1]= 3; break; case 3: freiegabeln[0]= 3; freiegabeln[1]= 4; break; case 4: freiegabeln[0]= 4; freiegabeln[1]= 0; break; }//end switch // printf("Philosoph %d prüft ob die Zwei gabeln Vorahnden\n", name); if(gabel[freiegabeln[0]] == FALSE && gabel[freiegabeln[1]] == FALSE){ printf("Philosoph %d nimmt seine gablen,", name); gabel[freiegabeln[0]] = TRUE; gabel[freiegabeln[1]] = TRUE; printf("und isst\n"); wait(); // printf("Philosoph %d ist fertig und gibt seinen Platz frei\n", name); teller[fetz] == FALSE; gabel[freiegabeln[0]] = FALSE; gabel[freiegabeln[1]] = FALSE; freiegabeln[0]= 0; freiegabeln[1]= 0; fetz = 0; }else{ // printf("Philosoph %d gibt seinen Platz frei\n", name); teller[fetz] == FALSE; freiegabeln[0]= 0; freiegabeln[1]= 0; fetz = 0; }//end if // printf("Philosoph %d wird aelter\n", name); gelebt++; }//end while }//end philosoph int main (void){ pthread_t p0, p1, p2, p3, p4; pthread_create (&p0, NULL, philosoph, 1); pthread_create (&p1, NULL, philosoph, 2); pthread_create (&p2, NULL, philosoph, 3); pthread_create (&p3, NULL, philosoph, 4); pthread_create (&p4, NULL, philosoph, 5); pthread_join (p0, NULL); pthread_join (p1, NULL); pthread_join (p2, NULL); pthread_join (p3, NULL); pthread_join (p4, NULL); return 0; }
bei diesem code isst immer nur philosoph 2 die anderen verhungern was kann hier das problem sein???
-
wo sind deine locks? zugriffsschutz?
kanns sein, dass fetz nicht init wird?