Hilfe pthread_mutex will nicht



  • das ist es nicht, mutex will nicht....



  • saver schrieb:

    das ist es nicht, mutex will nicht....

    "Mutex will nicht" ist eine recht magere Fehlerbeschreibung. Was genau geht denn in die Hose?



  • ich will mit mutex sockel vor gleichzeitigem Zugriff schützen. Das funktioniert nicht. Die anderen threads greifen, unabhängig davon, ob den grad ein lock gegeben ist drauf zu.



  • saver schrieb:

    Die anderen threads greifen, unabhängig davon, ob den grad ein lock gegeben ist drauf zu.

    Und woran erkennst du das? Das mit dem lock/unlock sieht richtig aus. sockel hast du jedoch nirgendwo initialisiert. Wenn du kein C11 benutzt dürfte da ein magischer Wert drin stecken.

    Lies dir zusätzlich diesen Beitrag durch, da es hier wohl Kommunikationsprobleme gibt.



  • Nach Abarbeitung der Schleife in main() wird der Mutex zerstört, egal in welchem Zustand sich die erzeugten Threads befinden!



  • Sorry, wenn ich mich hier falsch verhalten habe. Danke für deinen höflichen Hinweis. Und ich bin wirklich dankbar für jede Hilfe.



  • Annehmender schrieb:

    sockel hast du jedoch nirgendwo initialisiert.

    Das ist eine globale Variable und die werden, wenn nichts anderes angegeben ist, mit 0 initialisiert.



  • Danke, habe die While-Schleife in der Main ersetzt:

    int main(void) {
        printf("  Start*******************\n");
        if (0 != pthread_mutex_init(&lock, NULL)) {
            printf("Problem bei pthread_mutex_init()!\n");
        } else {
            struct Team *f1;
    
            pthread_t team1;
            f1 = &teams[0];
            int status1;
            status1 = pthread_create(&team1, NULL, &Runden, f1);
            if (status1) {
                printf("Problem bei pthead_create Teamname: %s \n", f1->name);
            }
            struct Team *f2;
    
            pthread_t team2;
            f2 = &teams[1];
            int status2;
            status2 = pthread_create(&team2, NULL, &Runden, f2);
            if (status2) {
                printf("Problem bei pthead_create Teamname: %s \n", f2->name);
            }
            struct Team *f3;
    
            pthread_t team3;
            f3 = &teams[2];
            int status3;
            status3 = pthread_create(&team3, NULL, &Runden, f3);
            if (status3) {
                printf("Problem bei pthead_create Teamname: %s \n", f3->name);
            }
            struct Team *f4;
    
            pthread_t team4;
            f4 = &teams[3];
            int status4;
            status4 = pthread_create(&team4, NULL, &Runden, f4);
            if (status4) {
                printf("Problem bei pthread_create Teamname: %s \n", f4->name);
            }
            if (0 != pthread_mutex_destroy(&lock)) {
                printf("Problem bei pthread_mutex_destroy()!\n");
            }
        }
        pthread_exit(NULL);
    }
    

    ...sprich: erzeuge die Threads nun einfach manuell hintereinander. Bekomme folgende ausgabe:
    Start*******************
    'The Runtime Exceptions' sind nun mit Runde 2 fertig.
    'Ueberholverbot' sind nun mit Runde 2 fertig.
    'The Runtime Exceptions' nimmt jetzt Staffelstab von Team 'Ueberholverbot' in die Hand.
    'Die laufenden Kopplungen' sind nun mit Runde 2 fertig.
    'Ueberholverbot' nimmt jetzt Staffelstab von Team 'Die laufenden Kopplungen' in die Hand.
    'The Runtime Exceptions' sind nun mit Runde 4 fertig.
    'Die laufenden Kopplungen' nimmt jetzt Staffelstab von Team 'Ueberholverbot' in die Hand.
    ohoh.........wo ist der Staffelstab??? Team 'The Runtime Exceptions' wurde disqualifiziert!!! Hinsetzen!!!
    'WiSo nur' sind nun mit Runde 2 fertig.
    'Ueberholverbot' sind nun mit Runde 4 fertig.
    'WiSo nur' nimmt jetzt Staffelstab von Team 'Die laufenden Kopplungen' in die Hand.
    ohoh.........wo ist der Staffelstab??? Team 'Ueberholverbot' wurde disqualifiziert!!! Hinsetzen!!!
    'Die laufenden Kopplungen' sind nun mit Runde 4 fertig.
    'Die laufenden Kopplungen' nimmt jetzt Staffelstab von Team 'Ueberholverbot' in die Hand.
    'WiSo nur' sind nun mit Runde 4 fertig.
    'Die laufenden Kopplungen' sind nun mit Runde 6 fertig.
    'WiSo nur' nimmt jetzt Staffelstab von Team 'Ueberholverbot' in die Hand.
    ohoh.........wo ist der Staffelstab??? Team 'Die laufenden Kopplungen' wurde disqualifiziert!!! Hinsetzen!!!
    'WiSo nur' sind nun mit Runde 6 fertig.
    'WiSo nur' nimmt jetzt Staffelstab von Team 'Ueberholverbot' in die Hand.
    'WiSo nur' sind nun mit Runde 8 fertig.
    'WiSo nur' nimmt jetzt Staffelstab von Team 'Ueberholverbot' in die Hand.
    'WiSo nur' sind nun mit Runde 10 fertig.
    *********************'WiSo nur' sind nun fertig. Haben den Staffelstab von Team 'Ueberholverbot' in der Hand haben.
    zafer@zafer-EP3

    Schon in der dritten Zeile greift ein Thread auf den eigentlich geschützten bereich zu. Kann das an der while-Schleife in der Thread-Funktion liegen?



  • Bleib bei der Schleife und erstell außerhalb dieser das Array pthread_t thread[ANZAHL_TEAMS]. Nach der Schleife wartest du auf die Thread mit pthread_join. Daraufhin zerstörst du den Mutex.
    Das unlock im Thread musst du aus dem if-Block ziehen.



  • vielen Dank, klappt 😃 😃 😃 danke danke


Anmelden zum Antworten