Varianle an Thread übergeben



  • Hallo zusammen,
    ich hoffe ihr könnt mir helfen, denn ich weiß mir nicht mehr zu helfen:)
    Ich habe EIn prorgamm dass einen Thread erzeugen soll und das 10 Int und Float Zufallszahlen erzeugen soll. Diese jeweils letzte soll in die Threadfunktion übergeben werden.
    Bei mir klappt die Übergabe nicht. Was mache ich da falsch?
    Wie kann ich einfacher übergeben?

    Danke

    [code="c"]
    void funktion1 (void *arg1)
    {

    printf("Int-Zahl= %i",arg1);
    printf("[TID:%li,PPID:%i] Threadfunktion1 \n",syscall(SYS_gettid),getppid() );
    pthread_exit(NULL);
    }

    int main()
    {
    struct Zahlen{int z1;float z2;};

    struct Zahlen Zahl;

    pthread_t ptr1, ptr2, ptr3;
    int res1;
    int res2;
    int bes1;
    int bes2;

    // reine Threadzeile
    res1 = pthread_create(&ptr1, NULL, (void *)&funktion1,(void *)Zahl.z1);

    //Fehlerabfrage Thread3
    if(res1 != 0)
    {
    perror("Thread creation failed!");
    }
    int i;
    for(i = 0; i<=10;i++)
    {
    Zahl.z1 = random() % 100; //Int Zahl 1-100 erzeugt
    Zahl.z2 =(float)rand() / RAND_MAX; //Float Zahl 0-1 erteugt
    printf("[TID: %li, PID: %i]int-Wert: %i float-Wert: %f \n",syscall(SYS_gettid), getpid(), Zahl.z1, Zahl.z2);
    }
    bes1 = pthread_join(&ptr1, NULL);

    /*if (bes1 !=0)
    {
    perror("Thread join failed");
    exit(1);
    }
    return 0;
    }


  • Mod

    Offen gesagt: da ist so ziemlich alles falsch. Das ist ja nicht einmal compilierbar! Selbst wenn man die Syntaxfehler(!) korrigiert, sind immer noch so viele Logikfehler drin, die kann ich gar nicht alle aufzählen. Die gröbsten:

    • C ist eine imperative Sprache. Ausdrücke werden der Reihe nach abgearbeitet. Reihenfolge ist von links nach rechts und von oben nach unten (außer innerhalb von Ausdrücken, aber das ist hier nicht wichtig).
    • Generische Programmierung mittels void* hast du gründlich missverstanden.
    • So etwas wie Compilerwarnungen solltest du mal einschalten, der Compiler nennt dir noch viel mehr Fehler als ich sie gerade aufzähle.

    Du musst erst einmal die Grundlagen besser beherrschen, eine Korrektur der Fehler macht hier keinen Sinn. Zu viel müsste umgeschrieben werden. Zu viel Erklärung notwendig. Du würdest es wahrscheinlich bloß übernehmen, ohne es zu verstehen.


  • Mod

    Ok, ich bin mal nicht so fies. Folgender Code macht halbwegs sauber das, was du beschreibst. Fehlerprüfungen habe ich mal rausgelassen, da nur kleines Beispiel:

    #include <stdio.h>
    #include <pthread.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/syscall.h> 
    
    struct Zahlen{int z1;float z2;};
    
    void* funktion1 (void *arg1)
    {
      struct Zahlen *zahlen = arg1;
      printf("[TID: %li, PID: %i] Threadfunktion1: int-Wert: %i float-Wert: %f \n",syscall(SYS_gettid), getpid(), zahlen->z1, zahlen->z2);
      return NULL;
    }
    
    int main()
    {
      struct Zahlen last_pair;
      pthread_t ptr1;
      int i;
    
      for(i = 0; i<=10;i++)
        {
          last_pair.z1 = random() % 100; 
          last_pair.z2 = (float)rand() / RAND_MAX; 
          printf("[TID: %li, PID: %i]int-Wert: %i float-Wert: %f \n",syscall(SYS_gettid), getpid(), last_pair.z1, last_pair.z2);
        }
    
      pthread_create(&ptr1, NULL, &funktion1, &last_pair);
      pthread_join(ptr1, NULL);
    
      return 0;
    }
    


  • Danke, du hast mir den Tag gerettet. Werde mich jetzt wie ich weiß wie es geht intensiver mit den Threads beschäftigen und deine Tips beherzigen.


  • Mod

    the_ChaoZZ schrieb:

    Danke, du hast mir den Tag gerettet. Werde mich jetzt wie ich weiß wie es geht intensiver mit den Threads beschäftigen und deine Tips beherzigen.

    Mal Hand auf's Herz (du bist schließlich anonym): Wirst du wirklich angucken, was ich dir genannt habe, oder habe ich Recht mit meiner Voraussage, dass du mein Beispiel in erster Linie bloß abschreiben und vielleicht noch etwas abändern wirst?



  • Werd mir das wirklich anschauen. Habe nächtste Woche ein Praktikum bei dem ich was mit Threads bauen muss. Danke nochmal.


Anmelden zum Antworten