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 virtueller run() -Methode? Ja, das ist der Java-Stil. Darüber sind wir schon lange hinweg 🤡

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


Log in to reply