Frage zu join



  • Hallo,
    spricht was dagegen, wenn ich mehrere Threads so starte:

    int main()
    {
    ...
      for (int i=0; i<10; i++)
        {
            std::thread t(worker, i);
            t.join();
        }
    ...
    }
    

    Oder muss ich erst joinen, wenn ich all Threads gestartet habe?
    Habe das Gefühl, dass ich erst joinen sollte, wenn alle Threads gestartet sind.



  • Was macht join?

    Zusatzfrage: wie lange lebt der Thread in deinem Beispiel?



  • Das Hauptprogramm wartet bis alle Threads in der for-Schleife beendet sind.
    Die Threads sind in der for-Schleife gültig. Sobald worker fertig ist, wird der Thread beendet.



  • @asd1 sagte in Frage zu join:

    Das Hauptprogramm wartet bis alle Threads in der for-Schleife beendet sind.

    Wie kommst du von t.join() zu alle?

    Die Threads sind in der for-Schleife gültig.

    steht im Widerspruch zu

    Sobald worker fertig ist, wird der Thread beendet.



  • Ach, hat sich erledigt. So wie ich das gemacht habe ist das falsch. Ich muss alle Threads starten und dann joinen, so das das Hauptprogramm erst dann weitermacht, wenn alle Threads durch sind.
    Wenn ich das mache wie vorgeschlagen, dann startet der erste Thread und das Hauptprogramm wartet bis es fertig ist und dann startet er den zweiten Thread und wartet wieder und so weiter.



  • @asd1 sagte in Frage zu join:

    Wenn ich das mache wie vorgeschlagen, dann startet der erste Thread und das Hauptprogramm wartet bis es fertig ist und dann startet er den zweiten Thread und wartet wieder und so weiter.

    Schönes Beispiel für ein klassisches Problem, das man sich schnell einfängt, wenn man mit mehreren Threads arbeitet. Den Parallelisierungsgrad des Programmablaufs bei korrekter Synchronisation zu maximieren ist je nach Problemklasse oft eine ziemliche Herausforderung und es ist leider nicht immer so schön offensichtlich, dass man de facto ein serielles Programm geschrieben hat, das am Ende sogar langsamer ist als ohne Threads. Bleib auf der Hut (eigenen Code stets hinterfragen und messen) 😉



  • @Finnegan sagte in Frage zu join:

    @asd1 sagte in Frage zu join:

    Wenn ich das mache wie vorgeschlagen, dann startet der erste Thread und das Hauptprogramm wartet bis es fertig ist und dann startet er den zweiten Thread und wartet wieder und so weiter.

    Schönes Beispiel für ein klassisches Problem, das man sich schnell einfängt, wenn man mit mehreren Threads arbeitet. Den Parallelisierungsgrad des Programmablaufs bei korrekter Synchronisation zu maximieren ist je nach Problemklasse oft eine ziemliche Herausforderung und es ist leider nicht immer so schön offensichtlich, dass man de facto ein serielles Programm geschrieben hat, das am Ende sogar langsamer ist als ohne Threads. Bleib auf der Hut (eigenen Code stets hinterfragen und messen) 😉

    Das bringt mich wieder zu unserem Lieblings C++ Compiler(simulator)-Hersteller Embarcadero. In einem Release konnte man einen Parallel-Build Modus aktivieren und im Task-Manager ist mir aufgefallen, dass nur ein Kern ausgelastet ist und die anderen Idle waren. Hab mir das genauer angeguckt und dabei festgestellt, dass zwar mehrere Compiler-Prozesse gestartet wurden, aber ein neuer immer erst dann, wenn ein anderer fertig wurde. Man kann das auch auf Prozess-Ebene verbocken.


  • Mod

    @DocShoe sagte in Frage zu join:

    Das bringt mich wieder zu unserem Lieblings C++ Compiler(simulator)-Hersteller Embarcadero. In einem Release konnte man einen Parallel-Build Modus aktivieren und im Task-Manager ist mir aufgefallen, dass nur ein Kern ausgelastet ist und die anderen Idle waren. Hab mir das genauer angeguckt und dabei festgestellt, dass zwar mehrere Compiler-Prozesse gestartet wurden, aber ein neuer immer erst dann, wenn ein anderer fertig wurde. Man kann das auch auf Prozess-Ebene verbocken.

    Oder es liegt einfach an Abhängigkeiten zwischen deinen Übersetzungseinheiten.



  • @SeppJ sagte in Frage zu join:

    @DocShoe sagte in Frage zu join:

    Das bringt mich wieder zu unserem Lieblings C++ Compiler(simulator)-Hersteller Embarcadero. In einem Release konnte man einen Parallel-Build Modus aktivieren und im Task-Manager ist mir aufgefallen, dass nur ein Kern ausgelastet ist und die anderen Idle waren. Hab mir das genauer angeguckt und dabei festgestellt, dass zwar mehrere Compiler-Prozesse gestartet wurden, aber ein neuer immer erst dann, wenn ein anderer fertig wurde. Man kann das auch auf Prozess-Ebene verbocken.

    Oder es liegt einfach an Abhängigkeiten zwischen deinen Übersetzungseinheiten.

    Ähhhh...... nein. Und wieso Abhängigkeiten zwischen den Übersetzungseinheiten? Man kann doch jede .cpp Datei separat übersetzen, die Abhängigkeiten enstehen doch erst beim Linken.


  • Mod

    @DocShoe sagte in Frage zu join:

    Ähhhh...... nein. Und wieso Abhängigkeiten zwischen den Übersetzungseinheiten? Man kann doch jede .cpp Datei separat übersetzen, die Abhängigkeiten enstehen doch erst beim Linken.

    Wer weiß, was du in deinen Makefiles (oder jeweiliges Äquivalent) alles versehentlich angegeben haben könntest. Du wärst jedenfalls nicht der erste, bei dem ich dieses Verhalten sehe.


Log in to reply