Thread problem



  • 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.



  • Bist du dir sicher, dass du nicht irgendwo doch eine Kopie von deinem Singleton erzeugst? Verbiete mal explizit den Copy-Construktor & Zuweisungs-Operator, indem du sie private machst...



  • das bind kopiert ??? Kann das sein ??? Moment mal..



  • AlexanderKiebler schrieb:

    das bind kopiert ??? Kann das sein ??? Moment mal..

    Das bind kopiert das Objekt nicht, wenn du einen Zeiger übergibst... Also es kopiert nur den Zeiger, nicht aber das Objekt, auf das verwiesen wird.
    Wenn du das this dereferenzierst, dann würde eine Kopie erzeugt...

    EDIT: http://www.boost.org/doc/libs/1_47_0/libs/bind/bind.html#with_member_pointers



  • Okay,
    ich habs denke ich ganz gut hin bekommen.
    THX für die Hilfe.

    jetzt ist es aber so, dass ich für ein boost::mutex auf dem Heap einen
    fehler beim bauen bekomme.

    Er sagt mir dass boost::_noncopyable privat sei.... ????

    Das hilft ir gerade aber nicht wirklich weiter.

    Also einfach ein

    boost::mutex mutex;
    

    und schon habe ich die Fehlermeldung



  • Also ich vermute mal, dass dein mutex eine Member-Variable in einer deiner Klassen ist(?)... Im Default-Copy-Constructor dieser Klasse möchte er dann alle Member kopieren, was er aber nicht kann, da ein mutex nicht kopierbar ist. Folglich wirst du irgendwo in deinem Code eine Kopie dieses Objektes erzeugen, das den Mutex enthält, da sonst (glaub ich) keine Fehlermeldung kommen sollte.

    Naja... Ist zwar ziemlich spekulativ, aber evtl. stimmts...



  • Oka,
    so läuft =).

    Ich hatte aber noch das Problem dass ich bei Folgemdem singelton
    zweimal den destruktoraufruf hatte:

    ...
    public:
        static DataBase & getInstance(){
            static DataBase instance;
            return instance;
        }
        ~DataBase();
    private:
        DataBase(){}
    ...
    

    Also ~DataBase wird zweimal aufgerufen, DataBase nur einmal.



  • Ergänz mal Folgendes und du kriegst vermutlich einen Compiler-Fehler.

    private:
            DataBase(const DataBase&){}
    

    Kurz gesagt, du erzeugst noch irgendwo eine Kopie...
    Es wir vermutlich einmal der parameterlose Konstruktor aufgerufen und einmal
    der Copy-Constructor, den du hiermit verbietest.


Anmelden zum Antworten