Viele Threads, ein Objekt



  • Hallo,

    ich habe folgendes vor:
    Ich habe ein Objekt der Klasse x. Darin wird öfters eine Methode von außen aufgerufen, die dann wiederum eine weitere Methode innerhalb des Objekts aufruft. Und darin soll nun ein neuer Thread erstellt werden, der eine weitere Methode aufruft.
    Da die Thread-Methode innerhalb einer Klasse static sein muss, kann man darin keine Variablen mehrfach anlegen, richtig? Also übergebe ich einfach den Pointer auf dieses Objekt mit, woraufhin die statische Methode eine nichtstatische Methode meines Objekts aufrufen kann. Wenn ich ja jetzt jedes Mal eine Variable anlegen lasse, wird das dann auch getan? Ich mein es handelt sich dabei um 1 Objekt, das mehrmals aufgerufen wird. Und es heißt ja, dass parallele Threads auf dem selben Speicherbereich arbeiten.
    Wenn das alles so nicht klappen sollte, wie mach ich das dann am Besten?
    Ich empfange eben regelmäßig Pakete, die dann einen Thread loslaufen lassen sollen, woraufhin etwas passiert. Und das parallele muss eben sein.

    Vielen Dank schon mal.
    Netmicky



  • kritisch ist es nur wenn du mit mehreren threads auf dieselben variablen/speicherbereiche zugreifst

    kannst dann die zugriffe in critical sections verpacken

    pseudocode:

    BEGIN_CRITICAL_SECTION(pCrit);
    //zugriff auf speicher den sich alle threads teilen
    END_CRITICAL_SECTION(pCrit);
    


  • Genau da entsteht ja mein Problem. Die Variablen sind dann schon die selben, also auch auf dem selben Speicherbereich, richtig?
    Das ist genau der Punkt, den ich nicht weiß, und den ich auch in keinen Büchern gefunden habe.



  • ich hab mich da auch noch nicht SO genau mit beschäftigt, aber afaik gibts etwas was sich mutex nennt, den sich der erste Thread holt, der in den kritischen Bereich hineinkommt, und den er wieder abgibt, wenn er hinausgeht. Kommt der nächste Thread an den kritischen Bereich, versucht er sich auch den mutex zu holen, und blockiert solange bis der vorherige thread den wieder abgegeben hat. So ist garantiert, dass sich immer nur ein Thread im kritischen bereich befindet.
    (bitte um korrektur wenn ich das falsch verstanden hab)



  • Ja, die Dinger nennt man auch Semaphoren, aber so weit bin ich ja noch gar nicht gekommen, weil mich ja eine andere Frage beschäftigt!
    Wenn ich ein Objekt habe mit lauter Member-Variablen....
    ...und eine Member-Methode als Thread vielmals aufgerufen wird, werden ja alle Threads die gleichen Member-Variablen benutzen, ABER was ist mit den Variablen, die in den Methoden deklariert werden? Sind die alle auf eigenen Speicherbereichen, oder alle auf demselben? Wenn ich also ein Objekt einer anderen Klasse in der Member-Methode anlegen ist das x-mal vorhanden, oder nur einmal?



  • Jeder Thread hat seinen eigenen Stack.



  • die lokalen variablen in den funktionen machen keine probleme wenn die funktionen von mehreren threads aufgerufen werden

    bei den membervariablen musst du aufpassen

    statt direkt auf die variablen zuzugreifen schreib get und set funktionen

    long Class::GetVal()
    {
      BEGIN_CRITICAL_SECTION(pCrit);
      long lTempVal = m_lVal;
      END_CRITICAL_SECTION(pCrit);
    
      return lTempVal; 
    }
    
    void Class::SetVal ( long lVal )
    {
      BEGIN_CRITICAL_SECTION(pCrit);
      m_lVal = lVal;
      END_CRITICAL_SECTION(pCrit);
    }
    

    so kann jeder thread auf die variablen zugreifen, ohne dass konflikte entstehn


Anmelden zum Antworten