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?


Anmelden zum Antworten