Thread problem



  • Hi,
    ich habe Folgendes:

    class Fu
    {
    private:
    bool ThreadRun;
    Fu():ThreadRun(true){};
    void stopThread(void){threadFunc_mutex->lock();ThreadRun=false; Join... etc};
    
    };
    
    /// Das ist ein eigener Thread
    void Fu::threadFunc(void)
    {
    
        while(ThreadRun)
        {
            threadFunc_mutex->lock();
             /// do something
            threadFunc_mutex->unlock();
        }
    
    }
    

    Es ist nun leider so, dass durch den Aufruf von stopThread
    die Variable ThreadRun nicht übernommen wird. Ich habe auch schon Volatile versucht, bringt aber nichts.

    Was geht, ist wenn ich aus ThreadRun einen pointer mache, und
    die variable dahinter setze.

    Wiso geht es mit einer einfachen variable nicht ??

    Grüße



  • EDIT: Ups... es wird wahrscheinlich kopiert und deswegen arbeitest du auf zwei verschiedenen Objekten. Lass dir die Adressen mal ausgeben

    Du wirst zwangsläufig Informationen auf dem Heap hinterlegen müssen.



  • Hi,

    also ich starte den Thread so:

    Fu::Fu()
    {
    boost::thread *_Thread = new boost::thread(boost::bind(&Fu::threadFunc,this));
    }
    


  • Okay moment...



  • AlexanderKiebler schrieb:

    Hi,

    also ich starte den Thread so:

    Fu::Fu()
    {
    boost::thread *_Thread = new boost::thread(boost::bind(&Fu::threadFunc,this));
    }
    

    Es macht keinen Sinn das boost::thread-Objekt auf dem Heap zu erstellen.

    Fu::Fu()
    {
    boost::thread _Thread(boost::bind(&Fu::threadFunc,this));
    }
    

    Wo liegt denn this? Ist es ein Stack oder Heap-Objekt?
    Also da this ja ein Zeiger ist, sollte keine Kopie erstellt werden.



  • Also Fu selber ist im Stack.
    Das Mit dem Thread sehe ich gleich.
    War eher ein Versuch hier... das wir d noch geändert. Tut das hier was zur Sache ??



  • Ich bin mir nicht sicher, aber ich würde vermuten, dass du auch ein undefiniertes Verhalten hast, da du den Thread im Konstruktor startest und das Objekt evtl. noch nicht komplett konstruiert ist.

    EDIT: Auch wenn ich vermute, dass es daran nicht liegen wird.



  • AlexanderKiebler schrieb:

    Also Fu selber ist im Stack.
    Das Mit dem Thread sehe ich gleich.
    War eher ein Versuch hier... das wir d noch geändert. Tut das hier was zur Sache ??

    Wenn es auf dem Stack liegt, dann überschreibst du dir vermutlich beim Verlassen des Scopes den Speicher... Im anderen Thread greifst du dann auf diese nicht mehr vorhandenen Daten zu.



  • Ja das mit this und konstruktor liegt mir auch schon ne Weile im magen.
    =)...



  • Nein das passiert nicht. Fu ist in singelton.
    Der Thred arbeitet nicht mehr, wenn Fu vo Stack genommen wird.
    Und die Addresse ist die Selbe (also von der boolschen variable) ?????



  • Es macht keinen Sinn das boost::thread-Objekt auf dem Heap zu erstellen.

    Wenn er es weiterreichen möchte durchaus.



  • 🙂 Na ja jetzt ists doch egal, ob der Thread auf dem heap oder nicht, bitte um vorschläge zum Thema *ggg*.



  • Ethon schrieb:

    Es macht keinen Sinn das boost::thread-Objekt auf dem Heap zu erstellen.

    Wenn er es weiterreichen möchte durchaus.

    EDIT: Ups... boost::thread ist nicht copyable... Ich nehm alles zurück....



  • AlexanderKiebler schrieb:

    🙂 Na ja jetzt ists doch egal, ob der Thread auf dem heap oder nicht, bitte um vorschläge zum Thema *ggg*.

    Dann zeig mal dein Singleton...
    Wenn es ein Singleton ist, liegt es aber wohl nicht auf dem Stack 😉



  • Also ich habe zuerst nicht auf dem Heap gehabt, dann wollt ich schauen obs auch mit Heap funktioniert und zum testen so gelassen. Ich werde es nicht auf dem Heap lassen, weil ich es selber für schöner halte, wenns auf dem Stack ist.

    Aber ich komm nicht damit klar, dass er mit den Wert von meiner
    boolschen Variable nicht übernimmt. Das macht mich fertig, zumal die Addresse die Selbe ist. Also im Thread und im Hauptthread....
    Das kann doch eigentlich garnicht sein ...



  • Ja du hast recht, =)...
    statische variablen werden auf dem heap erzeugt. ...



  • Zeig uns einfach noch etwas mehr Code, dann brauchen wir nicht zu spekulieren 😉

    Also ein minimales Beispiel, das Objekterzeugung und starten des Threads beinhaltet....



  • AlexanderKiebler schrieb:

    Ja du hast recht, =)...
    statische variablen werden auf dem heap erzeugt. ...

    Hab ich nie behauptet, da es glaube ich auch nicht der Heap ist, wo sie liegt, sondern noch ein anderer Speicherbereich, wo mir leider aber gerade nicht einfällt wie er heißt 😉



  • Was macht denn das boost::bind(Funktion,this)
    Okay, das wird am this liegen... ich versuchs nochmal etwas anderst.



  • AlexanderKiebler schrieb:

    Was macht denn das boost::bind(Funktion,this)

    Es sorgt für ein Objekt, das eine Funktion

    void operator()();
    

    hat, in der die entsprechende Funktion auf dem this-Objekt aufgerufen wird.

    boost::thread ruft diese Funktion nämlich auf.


Log in to reply