Problem bei random-wert,struct, thread



  • Hallo Kollegen,

    habe schon wieder ein leichtes Problem, vielleicht kann mir einer von Euch helfen.
    Sitze echt schon lange dabei.
    Vorweg: Kompilierung funzt fehlerfrei, trotzdem gehen verschieden Varinaten nicht. Das Problem liegt beim Auslesen bzw. beim Abspeichern vom Zufallswert.

    int retval = 0;
      int t;
      threadparam_t *threadpa = (threadparam_t*)malloc(sizeof(threadparam_t)*input);
      //oder auch so probiert //threadparam_t threadpa[input];
    
      for(t=0;t<input;t++)
      {
        threadpa[t].countTID = t;
        threadpa[t].randVal = randomValue();
    
        //oder auch direkt probiert
        //time_t timer;
        //time(&timer);
        //srand((int)timer);
        //threadpa[t].randVal = (rand()%1000);
    
        printf("CountTID: %i RandomValue: %i\n",threadpa[t].countTID,threadpa[t].randVal);    
        retval = pthread_create(&threadpa[t].th, NULL, output, &threadpa[t]);
    

    So sieht der Code aus. Verschieden Varianten schon probiert.
    Der Random-Wert stimmt einfach nicht. Ich glaube erzeigt im Nrivana herum.
    randomValue()funzt aber, da ich sie schon in einem eigenen Prg. laufen hab lassen.
    da kommt meist sowas heraus
    thread0 #Random-Wert: 10#
    thread1 #Random-Wert: -121468#
    thread2 #Random-Wert: 0#

    Bitte um Hilfe 🙄

    LG
    Luisi



  • Die struct schaut so aus:

    typedef struct threadparam_s
    {
      pthread_t th;
      int countTID;
      int randVal;
    }
    threadparam_t;
    

  • Mod

    Eine Funktion, die wir nicht kennen, in einem Programm, das wir kaum kennen, gibt einen Wert zurück, der dich aus Gründen, die wir nicht kennen, überrascht. Das ist ein bisschen mager, um dir helfen zu können.

    Kompilierung funzt fehlerfrei

    Auch ohne Warnungen? (Du hast doch brav alle Warnungen aktiviert, oder?) Außerdem benutzt du komische Konstrukte wie einen Pointercast bei malloc, die eventuelle Warnungen vor Fehlern verhindern.



  • output ist defekt.

    Und wie sieht die Ausgabe aus Zeile 17 aus?



  • SeppJ schrieb:

    Eine Funktion, die wir nicht kennen, in einem Programm, das wir kaum kennen, gibt einen Wert zurück, der dich aus Gründen, die wir nicht kennen, überrascht. Das ist ein bisschen mager, um dir helfen zu können.

    Klar aber RandomValue sieht nahezu so aus wie im Kommentarfenster
    die funktioniert auch, da ich sie schon getestet haben.
    Hier der gesamt Code dazu:
    [cpp]int randomValue()
    {
    time_t timer;
    int rand_num;
    time(&timer);
    srand((int)timer);
    rand_num = (rand()%1000);
    return(rand_num);
    }
    Am Besten funzt sie mit einem Sleep(1); 😃

    Kompilierung funzt fehlerfrei

    Auch ohne Warnungen? (Du hast doch brav alle Warnungen aktiviert, oder?)

    gcc -Wall -Wextra nehme ich immer.

    Hast du was Bessers ? Wäre fein.

    naja ich habe es auch so probiert:
    //oder auch so probiert //threadparam_t threadpa[input]

    hat leider auch nicht funktioniert.

    Ich wollte nicht den gesamten Code hier hinenstellen, da es keinen
    interessiert einige Seiten durchzulesen(glaub ich halt).

    Aber ich muss sagen der Fehler liegt sicher hier in der Region.
    Nur wo 😕

    Bin für jede Hilfe dankbar.
    😋


  • Mod

    s.luis schrieb:

    gcc -Wall -Wextra nehme ich immer.

    Ist ok.

    Ich wollte nicht den gesamten Code hier hinenstellen, da es keinen
    interessiert einige Seiten durchzulesen(glaub ich halt).

    Dies ist offensichtlich nicht der Code, denn die Ausgabe die du angibst, passt nicht zur Ausgabe im Code. Wenn du den Code umgeschrieben hast für das Forum, dann hast du eventuell auch den Fehler rausgemacht.

    Die Idee ist, dass du alles aus dem Programm hinaus nimmst, das nicht mit dem Fehler zu tun hat. Wenn du dein Programm nur noch ein paar Zeilen hat und den Fehler immer noch zeigt, dann stellst du es hier vor. Und zwar vollständig, so dass wir es compilieren und den Fehler selber sehen können. Wenn beim Zusammenkürzen des Programms plötzlich der Fehler nicht mehr auftritt, dann wirst du in einem der gekürzten Teile irgendwas dummes tun und solltest ihn dir nochmal angucken.

    Du benutzt anscheinend ein Linux/Posix. Wenn du einen Fehler durch falsche Initialisierung oder Überschreibung vermutest, dann hilft sehr oft valgrind. Mal mit allen Basistests aufrufen (vorher daran denken mit Debugoptionen (-g) zu compilieren!):
    http://cs.ecs.baylor.edu/~donahoo/tools/valgrind/



  • s.luis schrieb:

    Aber ich muss sagen der Fehler liegt sicher hier in der Region.

    Da bist du nicht der Erste der sich da täuscht. Leider auch nicht der Letzte.



  • Hallo Kollegen,

    habe den Fehler gefunden.

    Ist zwar nicht die schönste Lösung aber wenn ich
    Sleep(1); in die Randomfunktion einbaue dann funktioniert alles super.

    Scheint mir liefert die random-Funktion nicht schnell genug die Werte für mehrere Threads und deshalb kommen auch komische Dinge heraus.
    Wenn ich ein mutex darüberlege geht es auch.
    Habe jetzt mein Prg mit 5000-Threads laufen gelassen, war zwar nicht schnell, aber es arbeitet Korrekt.

    Dankeschön für die Hilfe.

    🙂

    LG
    Luis


  • Mod

    sleep ist einer der dümmsten pseudo Workarounds für eine Race-Condition. Wie kann man mit Threads programmieren wollen ohne die absoluten Grundlagen von Threads zu kennen? Zieh dir unbedingt mal ein Tutorial rein!



  • SeppJ schrieb:

    sleep ist einer der dümmsten pseudo Workarounds für eine Race-Condition. Wie kann man mit Threads programmieren wollen ohne die absoluten Grundlagen von Threads zu kennen? Zieh dir unbedingt mal ein Tutorial rein!

    Jetzt erkläre mir mal eines SeppJ, wennst du dir den code ansiehst, bekommt jeder
    thread bevor er erstellt wird schon seine Zufallszahl zugewiesen. Wie kann es da zu einer race-conditon führen???
    die zufallszahl wird dann in einer struct an den output-übergeben.

    es ist sicher ein timing-problem, jedoch weiss ich nicht warum. sonst hätte ich
    hier nicht um rat gefragt, sondern hätte einfach die lösung gepostet.

    ich kann auch mit joins auf einen thread warten. würde das problem auch lösen, jedoch nicht die ursache.

    luis



  • weiters noch: habe genug tutorials schon gelesen, macht aber keinen besseren programmierer, sondern die übung ist es. wie bei einem handwerk.
    und beim üben bin ich gerade dabei. 👍 👍 👍



  • aber ich muss Hrn. SeppJ schon recht geben. habe diesbezüglich sicher noch lernbetarf.
    habe es bei einem anderen bsp versucht. wieder ein fehler.

    das pthread_create macht nicht das was es soll, bei mir halt nicht 😡

    neues beispiel mit nur einem thread.
    der nur eine funktion ausführt und wieder derselbe timing-fehler.
    weise vorher die werte zu (mit outputs kontrolliert) und dann übergebe
    ich die struct dem pthread_create und ein wert stimmt manchmal nicht.
    shit shit 😡
    vielleicht habt ihr welche tipps,bbbiiiiittttteeee 🙂



  • Hatt SeppJ doch schon geschrieben:
    Reduziere deinen Code schrittweise auf das wesentliche. Wenn der Fehler nicht mehr auftaucht, ist er im entfernten Teil.

    Zeig doch mal deine Funktion output . Die rufst du doch mit pthread_create auf.



  • ich glaube, ich habe es jetzt. der fehler liegt darin, dass ich immer pthread_exit genommen habe, statt pthread_join. somit terminiert der main-thread vorher und wartet nicht auf die anderen threads.
    wenn er vorher terminiert, dann ist das ergebnis blödsinn, terminiert er nachher dann stimmt es.
    deshalb hat auch der hack mit dem sleep gefunzt.
    fixxxxxxmee 😃

    gehört zwar schon ins unix-forum,aber was soll es.

    hat wer ein gutes tutorial für threads, ausgenommen die standard-dinge.
    und man-pages die man nur dann versteht wenn man eh schon alles gecheckt hat.
    🤡

    danke+lg luis



  • DirkB schrieb:

    Hatt SeppJ doch schon geschrieben:
    Reduziere deinen Code schrittweise auf das wesentliche. Wenn der Fehler nicht mehr auftaucht, ist er im entfernten Teil..

    das war die richtige taktik.
    danke 👍 👍 👍

    😃


  • Mod

    s.luis schrieb:

    hat wer ein gutes tutorial für threads, ausgenommen die standard-dinge.

    join vs. exit ist ein Standardding. Dir fehlen die Grundlagen. Das sollte muss jedes brauchbare Tutorial behandeln.


Anmelden zum Antworten