Threads. Probleme mit Mutex



  • Ich habe folgende Aufgabenstellung:

    Nehmen Sie den Quelltext aus der letzten U ̈bung (thread2.c) als Vorlage und a ̈ndern Sie diesen wieimFolgendenbeschrieben.DasProgrammhateineglobalescharacterarraychar twelveDigits[12] , welches 12 ASCII-Zeichen aufnimmt1. Fu ̈llen Sie dieses Feld mit ’0’, also dem Integer-Wert 48.

    Implementieren Sie einen Thread, welcher in einer Endlosschleife dieses Feld als Zahl interpretiert und jeweils um eins erho ̈ht. D. h. die ASCII-Zahl soll Stellenweise von 0 bis 9 hochgeza ̈hlt werden, ohne in einen Integer umgewandelt zu werden. Bei einem U ̈berlauf einer Ziffer soll die daneben liegende Ziffer erho ̈ht werden (stellen Sie sich einen schnell laufenden Kilometerza ̈hler vor).

    mein Problem beginnt hier:
    Erstellen Sie einen zweiten Thread, der u ̈berpru ̈ft, dass die Zeichenfolgen in twelveDigits tatsa ̈chlich monoton ansteigen. Es soll also eine Meldung ausgegeben werden, falls ein klei- nerer Wert als zuvor beobachtet wird.

    pthread_mutex_t twelveDigit_mutex=PTHREAD_MUTEX_INITIALIZER;
    char twelveDigits[12];
    
    int mitzahl[2];
    
    int zahl=0;
    pthread_t t1,t2;
    
    void mitzaehlen(int z){
    
        mitzahl[0]=0;
        mitzahl[1]=0;
        int zehn=1;
        if(z==1){
        for(int i=11;i>=0; i--){
            mitzahl[0]+=twelveDigits[i]*zehn;
            zehn*=10;
        }
    
            printf("z1=%d\n",mitzahl[0]);
    
        }
            if(z==2){
                for(int i=11;i>=0; i--){
                    mitzahl[1]+=twelveDigits[i]*zehn;
                    zehn*=10;
                }
                printf("z2=%d\n",mitzahl[1]);
        }
    
    }
    void ausgabe(){
        int x=0;
        while(x<12){
    
            printf("%c",twelveDigits[x]);
            x++;
        }
    
        printf("\n");
    
    }
    
    void *thread(void *arg){
    
        int x=11;
    
        mitzaehlen(1);
    
            twelveDigits[x]=twelveDigits[x]+zahl;
        zahl++;
    
            if( twelveDigits[x]==58){twelveDigits[x]='0';
                twelveDigits[x-1]=twelveDigits[x-1]+1; zahl=0;}
            if(twelveDigits[x-1]==58){twelveDigits[x-1]='0';
                twelveDigits[x-2]=twelveDigits[x-2]+1;zahl=0;}
    
            if(twelveDigits[x-2]==58){twelveDigits[x-2]='0';
                twelveDigits[x-3]=twelveDigits[x-3]+1;zahl=0;}
                if(twelveDigits[x-3]==58){twelveDigits[x-3]='0';
                    twelveDigits[x-4]=twelveDigits[x-4]+1;zahl=0;}
                    if(twelveDigits[x-4]==58){twelveDigits[x-4]='0';
                        twelveDigits[x-5]=twelveDigits[x-5]+1;zahl=0;}
                        if(twelveDigits[x-5]==58){twelveDigits[x-5]='0';
                            twelveDigits[x-6]=twelveDigits[x-6]+1;zahl=0;}
                            if(twelveDigits[x-6]==58){twelveDigits[x-6]='0';
                                twelveDigits[x-7]=twelveDigits[x-7]+1;zahl=0;}
                                if(twelveDigits[x-7]==58){twelveDigits[x-7]='0';
                                    twelveDigits[x-8]=twelveDigits[x-8]+1;zahl=0;}
                                    if(twelveDigits[x-9]==58){twelveDigits[x-9]='0';
                                        twelveDigits[x-10]=twelveDigits[x-10]+1;zahl=0;}
                                        if(twelveDigits[x-10]== 58){twelveDigits[x-10]='0';
                                            twelveDigits[0]=twelveDigits[x-11]+1;zahl=0;}
                                            if(twelveDigits[0]==58){twelveDigits[0]='0';
                                                printf("Überlauf"); system("exit");zahl=0;}
    
        mitzaehlen(2);
        ausgabe();
    
        twelveDigits[x]='0';
        pthread_exit((void*) NULL);
    
        return NULL;
    }
    
    void *thread2(void *arg){
    
        if(mitzahl[0]>mitzahl[1]){
            printf("\n!!!!!!!!!!!FEHLER!!!!!!!!!!!\n");
        }
        else if(mitzahl[0]<mitzahl[1]) {
            printf("\nkontrolliert\n");
        }
        else if(mitzahl[0]==mitzahl[1]){
            printf("\ngleich\n");
    
        }
    
        return NULL;
    }
    
    int main(void) {
    
        for(int i=0; i<12; i++){
            twelveDigits[i]='0';
    
        }
    
        while(0<1){
    
            if( (pthread_create(&t1, NULL, *thread, NULL))!=0){
                printf("Thread1 läuft falsch");
            }
    
            if( (pthread_create(&t2, NULL, *thread2, NULL))!=0){
                printf("Thread2 läuft falsch");
            }
    
         pthread_join(t1,NULL);
         pthread_join(t2,NULL);
    
        }
        return 0;
    }
    

    Kann mir jemand sagen wie ich die Zahl die in Twelvedigits als einzelne char zeichen dargestellt wird als integer bekomme?

    An welcher stelle wäre das mutex_lock bzw , mutex_unlock sinnvoll?

    Mein zweiter Thread zeigt immer "FEHLER" Obwohl mitzahl[0] größer ist als mitzahl[1].

    Vorallem hier -->

    void *thread(void *arg){
    
        int x=11;
    
        mitzaehlen(1);
    
            twelveDigits[x]=twelveDigits[x]+zahl;
        zahl++;
    
            if( twelveDigits[x]==58){twelveDigits[x]='0';
                twelveDigits[x-1]=twelveDigits[x-1]+1; zahl=0;}
            if(twelveDigits[x-1]==58){twelveDigits[x-1]='0';
                twelveDigits[x-2]=twelveDigits[x-2]+1;zahl=0;}
    
            if(twelveDigits[x-2]==58){twelveDigits[x-2]='0';
                twelveDigits[x-3]=twelveDigits[x-3]+1;zahl=0;}
                if(twelveDigits[x-3]==58){twelveDigits[x-3]='0';
                    twelveDigits[x-4]=twelveDigits[x-4]+1;zahl=0;}
                    if(twelveDigits[x-4]==58){twelveDigits[x-4]='0';
                        twelveDigits[x-5]=twelveDigits[x-5]+1;zahl=0;}
                        if(twelveDigits[x-5]==58){twelveDigits[x-5]='0';
                            twelveDigits[x-6]=twelveDigits[x-6]+1;zahl=0;}
                            if(twelveDigits[x-6]==58){twelveDigits[x-6]='0';
                                twelveDigits[x-7]=twelveDigits[x-7]+1;zahl=0;}
                                if(twelveDigits[x-7]==58){twelveDigits[x-7]='0';
                                    twelveDigits[x-8]=twelveDigits[x-8]+1;zahl=0;}
                                    if(twelveDigits[x-9]==58){twelveDigits[x-9]='0';
                                        twelveDigits[x-10]=twelveDigits[x-10]+1;zahl=0;}
                                        if(twelveDigits[x-10]== 58){twelveDigits[x-10]='0';
                                            twelveDigits[0]=twelveDigits[x-11]+1;zahl=0;}
                                            if(twelveDigits[0]==58){twelveDigits[0]='0';
                                                printf("Überlauf"); system("exit");zahl=0;}
    
        mitzaehlen(2);
        ausgabe();
    
        twelveDigits[x]='0';
        pthread_exit((void*) NULL);
    
        return NULL;
    }
    

    vermute ich einen Fehler. ich habe schon so viele stunden damit verbracht. aber es kommt nie das richtige Ergebnis raus. Danke im Voraus



  • Fauler Strick; koordiniert euch wenigstens, bevor ihr öffentlich versucht, andere eure Hausaufgaben machen zu lassen.
    https://www.c-plusplus.net/forum/p2545732#2545732



  • Wutz schrieb:

    Fauler Strick; koordiniert euch wenigstens, bevor ihr öffentlich versucht, andere eure Hausaufgaben machen zu lassen.
    https://www.c-plusplus.net/forum/p2545732#2545732

    Ich bin noch nicht auf eine Lösung gekommen das hat nichts damit zutun das ich euch das machen lassen möchte. Alles was ich brauche ist ein Tipp wo und wie hier die Mutex_locks sinnvoll einzusetzen sind. Im letzten Post habe ich keine Hilfe bekommen also versuche ich es nochmal. Was spricht denn dagegen? Außerdem arbeite ich alleine also kein ihr.



  • Informatiker im All schrieb:

    Im letzten Post habe ich keine Hilfe bekommen

    An deiner Stelle würd ich mich mal fragen wieso...



  • vfbhrtfg schrieb:

    Informatiker im All schrieb:

    Im letzten Post habe ich keine Hilfe bekommen

    An deiner Stelle würd ich mich mal fragen wieso...

    Sorry wusste nicht das dieses Forum nur für Genies wie dich sind. Idioten, wen ihr keine Lust habt dann antwortet einfach gar nicht, und verderbt mir nicht die Laune. Ich hab ne klare Frage zu C gestellt genau dafür ist das hier auch da, nicht um solche komischen Hinterwäldler Kommentare zu bekommen. Wen ich frage wo ein mutex sinnvoll wäre dann habt ihr damit nicht meine Aufgabe gemacht sondern nur geholfen. Seid ihr wirklich so blöd. den ganzen code habe ich selbst geschrieben. wegen einer Zeile wollt ihr mich als doof darstellen. Sucht euch nen anderen Job, Internetgenies gibts schon genug. 😡 😡



  • Informatiker im All schrieb:

    void *thread2(void *arg){
    
        if(mitzahl[0]>mitzahl[1]){
            printf("\n!!!!!!!!!!!FEHLER!!!!!!!!!!!\n");
    

    Mein zweiter Thread zeigt immer "FEHLER" Obwohl mitzahl[0] größer ist als mitzahl[1].

    Genau dann soll ja auch "FEHLER" ausgegeben werden! Also wo liegt das Problem?

    Informatiker im All schrieb:

    Kann mir jemand sagen wie ich die Zahl die in Twelvedigits als einzelne char zeichen dargestellt wird als integer bekomme?

    Ich frage mich, weshalb du nicht mal auf die Idee gekommen bist nach sowas zu googlen wie char to int. Zu aufwändig? Zu schwierig? Dann wärst du schon lange fertig...



  • Es geht weniger um deinen Code, sondern eher darum wie du ihn formatiert hast (bzw. nicht formatiert hast).
    Teilweise aneinandergereihte Wörter ohne Leerzeichen und keine Code-Tags im ersten Post.
    Wenn du dann noch eine banale Frage (siehe Antwort obendrüber) stellst, ist es unwahrscheinlich, dass sich jemand die Mühe macht dir zu helfen.



  • uiuiui schrieb:

    Informatiker im All schrieb:

    void *thread2(void *arg){
    
        if(mitzahl[0]>mitzahl[1]){
            printf("\n!!!!!!!!!!!FEHLER!!!!!!!!!!!\n");
    

    Mein zweiter Thread zeigt immer "FEHLER" Obwohl mitzahl[0] größer ist als mitzahl[1].

    Genau dann soll ja auch "FEHLER" ausgegeben werden! Also wo liegt das Problem?

    Informatiker im All schrieb:

    Kann mir jemand sagen wie ich die Zahl die in Twelvedigits als einzelne char zeichen dargestellt wird als integer bekomme?

    Ich frage mich, weshalb du nicht mal auf die Idee gekommen bist nach sowas zu googlen wie char to int. Zu aufwändig? Zu schwierig? Dann wärst du schon lange fertig...

    Sorry ich meinte mitzahl[1] ist größer als mitzahl [0] oder sollte zumindest so sein.


  • Mod

    Informatiker im All schrieb:

    Sorry ich meinte mitzahl[1] ist größer als mitzahl [0] oder sollte zumindest so sein.

    Zwischen Sollen und Sein ist ein großer Unterschied.

    Leider gibt es aber absolut keine Möglichkeit, den Wert einer Variablen zur Laufzeit zu prüfen.



  • also wenn ich da jetzt nichts übersehen habe, wird
    1. thread2 aufgerufen, bevor die berechung in mitzählen() unter der bedingung z == 1 abgeschlossen ist
    2. z gar nicht = 2 gesetzt, sodass die berechnung unter der bedingung z == 2 gar nicht ausgeführt wird.

    und da wundert es dich dann, dass mitzahl[0] > mitzahl[1]?



  • Wie gesagt, er weiß halt überhaupt, nicht was er tut. Für Uni-Niveau ein wenig peinlich. Allerdings ist mir vorher entgangen, dass wir offenbar alle "Idioten" sind und "blöd", siehe hier:

    Informatiker im All schrieb:

    Sorry wusste nicht das dieses Forum nur für Genies wie dich sind. Idioten, wen ihr keine Lust habt dann antwortet einfach gar nicht, und verderbt mir nicht die Laune. Ich hab ne klare Frage zu C gestellt genau dafür ist das hier auch da, nicht um solche komischen Hinterwäldler Kommentare zu bekommen. Wen ich frage wo ein mutex sinnvoll wäre dann habt ihr damit nicht meine Aufgabe gemacht sondern nur geholfen. Seid ihr wirklich so blöd. den ganzen code habe ich selbst geschrieben. wegen einer Zeile wollt ihr mich als doof darstellen. Sucht euch nen anderen Job, Internetgenies gibts schon genug.



  • ja nicht umsonst fliegen 2/3 oder so in den ersten 3 semestern durch und wenn ich damals (tm) gesagt habe, dass da im skript irgendwelche übungsaufgaben zu was auch immer drin stehen, wurde ich auch immer ein wenig komisch angesehen.

    trotzdem habe ich mir die 5 minuten zeit genommen gemacht, mir den code anzusehen und darauf hinzuweisen, wo das problem liegt. 🙄

    z = 2 gibts übrigens doch, aber da wurde die bedingung in thread2 ja schon lange ausgewertet und der thread beendet. merke: (mehrere) threads werden verwendet, wenn mehrere berechnungen gleichzeitig ausgeführt werden sollen. wenn irgendetwas hintereinander ausgeführt werden soll oder kann (z.b. weil die eine berechnung von dem ergebnis der anderen abhängt), dann verwendet man keine threads.



  • Wade1234 schrieb:

    also wenn ich da jetzt nichts übersehen habe, wird
    1. thread2 aufgerufen, bevor die berechung in mitzählen() unter der bedingung z == 1 abgeschlossen ist
    2. z gar nicht = 2 gesetzt, sodass die berechnung unter der bedingung z == 2 gar nicht ausgeführt wird.

    und da wundert es dich dann, dass mitzahl[0] > mitzahl[1]?


  • Mod

    Informatiker im All schrieb:

    Wade1234 schrieb:

    also wenn ich da jetzt nichts übersehen habe, wird
    1. thread2 aufgerufen, bevor die berechung in mitzählen() unter der bedingung z == 1 abgeschlossen ist
    2. z gar nicht = 2 gesetzt, sodass die berechnung unter der bedingung z == 2 gar nicht ausgeführt wird.

    und da wundert es dich dann, dass mitzahl[0] > mitzahl[1]?


Log in to reply