[HILFE] globale Variablen und multithreading



  • Hallo,

    ich habe mir ein paar tutorials angeschaut, aber ich kann das problem nicht lösen. also:

    MyBeispiel.cpp
    
        methode1(){}
        methode2(){}
    
        methode3(){
            int myCounter;
            for(int i = 0.......){}
            counter = i-1;           
            // counter = counter + i; 
    }
    

    Problem: MyBeispiel.cpp ist keine Klasse sondern nur eine Sammlung von Methoden. Die methode3() läuft mehr als nur einmal, so dass der myCounter bei jedem Durchlauf erneut initialisiert wird (zählt also ab 0 wieder) und der soll sich aber in jedem durchgang die "i" merken und zum letzten wert addieren. Wenn ich eine globale Variable "counter" definieren würde, würde das auch nicht gehen da ich multithreading habe.

    Ich entschuldige mich wenn dass für manche zu einfach ist 🙂



  • Hallo

    übergib den Startwert von i als Parameter. Wenn du das als Referenz machst, kannst du auch den Endewert wieder zurückgeben und so für den nächsten Aufruf zwischenspeichern.

    bis bald
    akari



  • akari schrieb:

    Hallo

    übergib den Startwert von i als Parameter. Wenn du das als Referenz machst, kannst du auch den Endewert wieder zurückgeben und so für den nächsten Aufruf zwischenspeichern.

    bis bald
    akari

    Wie meinst du das? kannst du das mit einem kleinem beispiel andeuten?

    besten dank



  • Hallo

    ich meine das so

    int mehtode3(int &counter)
      {
        for(int i = 0.......){...}
        counter += i; 
      }
    ...
    
    // Benutzung :
    int counter = 0;
    methode3(counter);
    ...
    methode3(counter);
    

    Im Grunde wäre dafür eine Wrapper-Klasse gut, die als Member den counter hat.
    Dann kannst du in jeder einzelnenInstanz einen einzelnen Counter hochzählen.

    bis bald
    akari



  • ich bin mir nicht sicher ob das gehen wird WEIL ich habe mehrere therads, und wenn ich wie von dir vorgeschlagen schreibe

    int counter =0
    

    dann läuft z.b. der erste thread:

    int counter =0
    for(int i =....}
    

    und dann kommt der zweite thread, initialisiert mit int counter = 0 wieder auf "0" obwohl der erste thread gar nicht fertig ist 😕

    du hast die variable int counter global definiert und deswegen wird sich auch von jedem thread überschrieben. eine membervariable kann ich ja auch nicht machen da es sich um keine klasse sondern nur eine ansammlung an der methoden handelt.

    danke für deine mühe



  • Hallo

    mir ist immer noch nicht klar ob du nun systemweit (auch über die Threads) nur genau einen Zähler brauchst oder für bestimmte Abläufe jeweils einen Zähler.
    Im letzteren Fall ist mein Code genau das richtige.

    Im ersteren kannst du es so vereinfachen

    int mehtode3()
    {
      static int counter = 0;
      for(int i = 0.......){...}
      counter += i;
      }
    

    Somit hast du genau einen Counter. Allerdings bist du immer noch selber für die Threadsafety verantwortlich. Stichwort ist Critical Section

    bis bald
    akari



  • akari schrieb:

    Hallo
    ....
    akari

    hallo akari,

    ich habe mehrere threads und jeder thread bzw. ablauf hat einen eigenen zähler. threads überlappen sich während des ablaufs natürlich und somit verändert (initialisiert) der eine thread den zähler des anderen.

    membervariable geht wohl nur in einer class oder? ich meine in einer .cpp bzw. .h wo nur methoden stehen nicht??

    danke dir



  • Hallo

    dann brauchst du grundsätzlich die erste von mir genannte Methode.

    Das eigentliche Problem was du hast ist aber nur von Thread-Seite aus zu lösen, du must die methode3 in einer sogenannten Critical Section ausführen, die sicherstellt das die Methode immer nur genau von einem Thread aus aufgerufen wird. Siehe auch Thread synchronisieren.
    Wie das genau geht ist von der von dir verwendeten Thread-Implementation abhängig. Threads sind nicht im C++ Standard und plattformabhängig (es gibt natürlich plattformunabhängige Wrapper). Lies dir also die Doku dazu durch.

    bis bald
    akari



  • Wenn jeder Thread genau einen Counter hat, dann gibt es meiner Meinung nach zwei grundlegende Methoden.

    1. Du legst in jedem Thread einen counter irgendwo an und führst den immer mit, so dass die Methode den counter übergeben bekommt. Die Methode sieht dann so aus, wie es akari beschrieben hat.

    2. Du legst den counter als Thread Specific Data an und holst dir innerhalb von Methode immer den zugehörigen counter.



  • akari schrieb:

    Hallo

    dann brauchst du grundsätzlich die erste von mir genannte Methode.
    .................

    bis bald
    akari

    hallo akari,

    dein vorschlag hat mir am anfang sehr geholfen-alles klappte. aber als ich danach noch etwas testen wollte... 😞

    also, ich arbeite mit einem pipeliner. dieser pipeliner.exe schaut in bestimmten dateiverzeichnissen nach neu abgelegten dateien und verarbeitet diese gleich, um aus diesen dateien (ascii) attribute rauszufischen.

    1. wenn sich z.b. 3 dateien in so einem verzeichnis befinden und ich den pipeliner starte - funktioniert deine methode perfect - pipeliner erzeugt 3 threads und jedes thread hat einen eigenen counter.

    2. wenn ich aber, während der pipeliner im hintegrund auf neue dateien wartet, ihm einzeln solche archiv-dateien ins verzeichnis ablege, nimmt er diese, aber der counter wird nicht dann mit "0" initialisiert sondern er zählt weiter wo er bei den ersten dateien aufgehört hat, weiter.

    ich will wirklich alles versuchen bevor ich auf das beschiessene ein-thread system zurückgreife.

    besten dank

    vedran


Anmelden zum Antworten