std::thread als Klassenattribut
-
Hallo,
Ich bekomme es einfach nicht hin eine neue Klasse zu schreiben, die einen std::thread als Attribut hat. Der thread soll erst in einer anderen methode (nicht im konstruktor).
Mein Code bis jetzt sieht so aus:class newThread{ bool finished; bool started; public: std::thread *wThread;
Jetzt will ich eine methode run haben in der ich den thread ausführe.
void start(){ wThread(test); }
Warum funktioniert das nicht und gibt es eine Möglichkeit das zu machen?
-
Du hast einen Zeiger. Ich würde mich an deiner Stelle mit den Grundlagen beschäftigen, bevor du Multithreaded-Programme schreibst...
-
Ja aber es müsste ja eigentlich irgendwie so aussehen:
std::thread wThread; newThread():wThread(test){
Allerdings bekomme ich hier in der ersten Zeile den Fehler "std::thread &std::thread::operator=(const std::thread &) is inaccessible".
Ausserdem muss ich hier vor dem Konstruktor schon festlegen welche Funktion ich ausführen will.
-
wThread = new std::thread(test);
Aber da du nicht mal mit Pointern umgehen kannst, würde ich mir den Thread-Kram mal ganz, ganz schnell aus dem Kopf schlagen und wieder bei den Grundlagen anfangen.
-
cooky451 schrieb:
Aber da du nicht mal mit Pointern umgehen kannst, würde ich mir den Thread-Kram mal ganz, ganz schnell aus dem Kopf schlagen und wieder bei den Grundlagen anfangen.
Gewissermaßen gleichzeitig zum "Aus dem Kopf schlagen" bei den Grundlagen anfangen.
Generell mal eine Frage:
Bei Klassen, die einen neuen Thread starten, habe ich oft gesehen, dass da Vererbung im Spiel ist. Was ist besser: Member oder Vererbung?
-
Member.
-
Nathan schrieb:
Bei Klassen, die einen neuen Thread starten, habe ich oft gesehen, dass da Vererbung im Spiel ist.
Du meinst eine
Thread
-Basisklasse mit pur virtuellerrun()
-Methode? Ja, das ist der Java-Stil. Darüber sind wir schon lange hinwegNathan schrieb:
Was ist besser: Member oder Vererbung?
Tendenziell Member, da du eine schwächere Kopplung hast. Mit
std::thread
hast du zudem den Vorteil, dass du beliebige Callables (Freie und Memberfunktionen, Funktoren, Lambda-Ausdrücke) binden kannst.
-
OK, danke euch.
Wenn man erst in einer Memberfunktion einen Thread starten will, kann man doch als Alternative lokal einen Thread starten und den dann mit detach() weiterlaufen lassen, oder?
-
Das kommt darauf an was du willst. Du brauchst auch hier überhaupt keinen Pointer, std::thread hat nen default-Konstruktor und move-assignment-Operator. Allgemein würde ich std::thread allerdings nie einfach so benutzen, bau dir nen raii_thread der im Destruktor entweder joined oder detached.
-
Ja, meine Frage war auch eher theoretisch, habe noch nie richtig mit Threads gearbeitet.