Threads die nicht static attribute bzw methoden verwenden



  • Ich stehe vor folgendem Problem:

    Ich habe Klasse a die gewisse methoden mitbringen. Mit dieser Klasse a sollen nun aber mehrere Objekte erzeugt werden die gleichzeitig Arbeiten können. Lösung -> Threads. Einzige Problem ist, Threads verlangen statische Elemente, sowohl die Methode als auch die Attribute mit denen sie arbeiten sollen. Das Problem ist halt nur, ich kann die Sachen nicht statisch machen, da jedes Objekt zwar die gleichen Attribute hat, aber andere Werte verwendet, was ein static ausschhließt.
    Nun bin ich über google auf die boost bibliothek gekommen, die soll angeblich bei solchen Problemen helfen können. Nur ich schaff es nicht damit mein Problem zu lösen. Es kommen immernoch die "muss statische sachen verwenden" Fehlermeldungen.

    class Klasse
    {
       int a;
       int b;
    
       Klasse(int,int);
       void tuhwasmitaundb();
    };
    
    int main()
    {
       Klasse neu(2,3);
       boost::thread neuer_thread(neu.tuhwasmitaundb);
       Klasse neuII(4,2);
       boost::thread neuer_threadII(neuII.tuhwasmitaundb);
    }
    

    Natürlich stark vereifacht gibt dieser Codeschnipsel aber dennoch die Logik wieder die dem interressanten Programmabschnitt inne wohnt. Wie kann ich das Problem lösen?

    Danke für eure Hilfsbereitschaft... :schland:



  • Nur ein kleiner Tipp: boost::bind.
    Den Rest schaffst du alleine, oder? 🙂



  • EDIT: Sorry for writing so much Käse...



  • Jud4s schrieb:

    class Klasse
    {
       int a;
       int b;
    
       Klasse(int,int);
       void tuhwasmitaundb();
    };
    
    int main()
    {
       Klasse neu(2,3);
       boost::thread neuer_thread(neu.tuhwasmitaundb);
       Klasse neuII(4,2);
       boost::thread neuer_thread(neuII.tuhwasmitaundb);
    }
    

    Das, was bei neu.tuhwasmitaundb und neuII.tuhwasmitaundb rauskommt, kann nur mit dem Funktionsaufruf-Operator kombiniert werden.

    Achtung: Du willst hier scheinbar die Threads und anweisen die Funtion tuhwasmitaundb auf den Objekten neu und neuII auszuführen. Das Problem hier ist folgendes:
    - Du startest die Threads
    - main wird beendet
    - Dabei werden die Thread-Objekte und die Klasse-Objekte zerstört
    - Die Threads werden von den Thread-Objekten "detatcht" (laufen weiter ohne Thread-Objekt)
    - Die Threads greifen eventuell immernoch auf a und b der Objekte zu, die es aber schon gar nicht mehr gibt.

    Kaboom!

    Du kannst es also zB so machen:

    Klasse obj1 (2,3);
      boost::thread t1 (boost::bind(&Klasse::tuhwasmitaundb,&obj1));  // #1  
      ...
      t1.join(); // warten, bis thread fertig ist
    

    oder so

    Klasse obj1 (2,3);
      boost::thread t1 (boost::bind(&Klasse::tuhwasmitaundb,obj1));  // #2
    

    #1: bind liefert einen Funktor, der einen Zeiger auf obj1 speichert. obj1 muss also lang genug leben. Deswegen das join().
    #2: bind liefert einen Funktor, der eine Kopie des Klasse-Objekts enthält. die Funktion tuhwasmitaundb wird nicht auf obj1 aufgerufen, sondern auf einer Kopie.

    kk



  • CSpille schrieb:

    Bei der Verwendung von boost::bind muss nämlich das Fortbestehen des Objektes
    garantiert sein.

    Nö, muss nicht.

    using boost::bind;
    using boost::ref;
    bind(&Klasse::elementFunktion,obj)      // kopiert Objekt
    bind(&Klasse::elementFunktion,&obj)     // kopiert Zeiger
    bind(&Klasse::elementFunktion,ref(obj)) // kopiert "Referenz"
    

    Im ersten Fall ist es egal, was mit dem Objekt obj später passiert, da der Thread auf einer Kopie arbeiten wird. (Der Funktor speichert eine Kopie.)


Log in to reply