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?
-
boost::thread thread(std::bind(counter));funktioniert möglicherweise.
-
Du musst schon
std::moveverwenden, 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, fallsboost::threadden Funktor intern kopiert. Müsste man nachlesen oder ausprobieren.EDIT: Ja,
threaddarf die Funktion kopieren. Das kann so also nicht funktionieren.EDIT: Nimm doch einfach einen
shared_ptr.EDIT: Vielleicht ist das mit dem
shared_ptrnicht 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
threads nicht in der Schleife auf dem Stack anlegen, oder ist das so beabsichtigt?
-
TyRoXx schrieb:
Du musst schon
std::moveverwenden, 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