boost::thread mit moveable Objekt



  • Hallo zusammen,

    Ich verwende zur Zeit boost 1.46.1.
    Da das Starten eines Threads für ein Moveable-Objekt in boost 1.46.1 scheinbar noch nicht implementiert ist, möchte ich gerne wissen wie ihr folgenden Code umsetzen würdet.

    #include <boost/thread.hpp>
    #include <iostream>
    
    class Counter {
    public:
            Counter(int i) : i(i) {}
            Counter(Counter&& counter){
                    this->i = counter.i;
                    counter.i = 0;
            }
            void operator()(){
                    for(int j=0; j<10000; ++j){
                            std::cout << j*i << std::endl;
                    }
            }
    private:
            int i;
    };
    
    int main(){
            for(int i=0; i<10; ++i){
                    Counter counter(i);
                    boost::thread thread(counter);
            }
    }
    

    Er kompiliert leider nicht, da Counter keinen Copy-Konstruktor hat.

    Würdet ihr das Objekt auf dem Heap erzeugen und einen Smart-Pointer benutzen oder geht es auch anders?

    Gruß,
    XSpille



  • Das Objekt in nen std::vector speichern und mit std::ref übergeben? Oder verwechsel ich da gerade was?


  • Mod

    boost::thread thread(std::bind(counter));
    

    funktioniert möglicherweise.



  • Du musst schon std::move verwenden, damit der richtige Konstruktor aufgerufen wird. Es wäre mir neu, wenn man benannte Objekte implizit "moven" könnte.
    Vielleicht hilft das aber auch nicht, falls boost::thread den Funktor intern kopiert. Müsste man nachlesen oder ausprobieren.

    EDIT: Ja, thread darf die Funktion kopieren. Das kann so also nicht funktionieren.

    EDIT: Nimm doch einfach einen shared_ptr .

    EDIT: Vielleicht ist das mit dem shared_ptr nicht so offensichtlich, also hier ein Beispiel:

    boost::shared_ptr<Counter> c = boost::make_shared<Counter>();
    	boost::thread t(boost::bind(&Counter::operator (), c));
    

    Natürlich solltest du deine thread s nicht in der Schleife auf dem Stack anlegen, oder ist das so beabsichtigt?



  • TyRoXx schrieb:

    Du musst schon std::move verwenden, damit der richtige Konstruktor aufgerufen wird. Es wäre mir neu, wenn man benannte Objekte implizit "moven" könnte.

    boost::thread thread(std::move(counter));
    

    So funkts...

    Kein Kommentar 🙄

    Manchmal vergisst man halt triviale Sachen 🤡
    Naja... Fast 2 Monate kein C++ geproggt :p


Anmelden zum Antworten