std::thread:join



  • Hallo,

    wo liegt der Unterschied zwischen std::thread(doSomething).join() und der Nutzung eines einfachen Funktionsaufrufes? Effektiv muss mein Hauptprogramm auf das Durchlaufen von doSomething() warten, da bringt mir der Extrathread doch nichts, oder?

    Und verstehe ich es richtig, dass std::thread(doSomething) automatisch den thread bereits startet, ja? Damit der Thread nicht abbricht wenn die Callfunktion durchgelaufen ist muss ich detach() aufrufen? Verstehe ich das richtig?



  • Namenloser324 schrieb:

    Hallo,

    wo liegt der Unterschied zwischen std::thread(doSomething).join() und der Nutzung eines einfachen Funktionsaufrufes?

    Ersteres ist langsamer weil sinnloserweise ein Thread erstellt wird.

    Namenloser324 schrieb:

    Und verstehe ich es richtig, dass std::thread(doSomething) automatisch den thread bereits startet, ja?

    Ja.

    Namenloser324 schrieb:

    Damit der Thread nicht abbricht wenn die Callfunktion durchgelaufen ist muss ich detach() aufrufen? Verstehe ich das richtig?

    Nicht ganz. Irgendwas muss passieren, wenn der Destruktor des Threads läuft. Entweder nichts (implizite detach), thread killen (implizite kill) oder warten (implizite join). Alle drei Varianten sind schlecht. Bei std::thread hat man sich fürs killen entschieden, bei async für warten.
    Statt den Thread zu detachen kannst du auch zum Beispiel den Thread in einen vector<thread> moven um das Problem zu umgehen, denn die Lebenszeit hängt nicht an der aufrufenden Funktion, sondern am Threadobjekt.



  • Danke 🙂

    Wieso existiert dann std::thread::join, wenn es langsamer ist als ein Funktionsaufruf und ansonsten identisch?



  • Weil du manchmal auf einen Thread warten willst. Der Trick ist zwischen dem Threaderstellen und join was sinnvolles zu tun.

    void mergesort(it start, it end){ //gibt bessere Sortierverfahren mit Threads
        if (end - start < 2)
            return;
        it mid = start + (end - start) / 2;
        thread t(mergesort, start, mid); //anderer Thread soll erste Hälfte sortieren
        mergesort(mid, end); //wir sortieren zweite Hälfte
        t.join(); //warten bis der andere Thread fertig ist
        merge(start, mid, end);
    }
    

    Ich sehe aber immer wieder Leute, die einen Thread erstellen und sofort join aufrufen. Das zerstört natürlich den Sinn von Threads.



  • Ah, ok, sehr gut das du das explizit erwähnst, in allen Beispielen die ich so gesehen habe (~3,4 Stück) wurde nämlich direkt danach join() aufgerufen was wie du sagst das ganze natürlich sinnfrei werden lässt.

    Vielen Dank, dann sind meine derzeitigen Fragen beantwortet 🙂



  • Viel schöner geht das mit std::asnyc .


Anmelden zum Antworten