Main auf mehrere Threads warten



  • Hi, Leute ich habe ein kleines Problem:
    Ich möchte, dass mehrere Dateien gleichzeitig geladen werden, die main() aber darauf wartet! Wie löse ich das? Rufe ich
    Thread1.join();
    Thread2.join();
    auf, dann wartet zwar die main(), bis beide fertig sind, diese sind aber nichtmehr parallel und das möchte ich ja nicht :D.
    Ich möchte, dass die main() wartet aber die Threads parallel laufen.



  • Doch, ist schon noch paralell: join() bewirkt nur dass gewartet wird bis der Thread fertig ist, laufen tut er jedoch vorher schon.

    Das einzige was du damit nicht kannst ist kucken wer zu erst fertig wird, sprich wenn du beide joinst geht es auch erst weiter wenn beide fertig sind.



  • void loadFile(string const& filename)
    {
        // file laden
    }
    
    int main()
    {
        std::thread t1([](){ loadFile("a.txt"); });
        std::thread t2([](){ loadFile("b.txt"); });
        // files werden nun parallel gelesen
        t1.join();
        t2.join();
        // nun wird auf beide Threads gewartet, und beide Files sind geladen
    
        return 0;
    }
    


  • Wenn das Laden nicht eine aufwändige Bearbeitung der Daten beinhaltet, wird das Lesen mit Threads eher langsamer ablaufen.



  • Da bietet sich auch eigentlich std::async an.

    :::
    
    vector<char> load_file(string const& filename);
    
    int main()
    {
      future<vector<char>> f1 = async(load_file,"dies.txt");
      future<vector<char>> f2 = async(load_file,"das.txt");
      vector<char> v3 = load_file("blah.txt");
      vector<char> v1 = f1.get(); // blokiert ggf. bis die Antwort da ist
      vector<char> v2 = f2.get(); // blokiert ggf. bis die Antwort da ist
      // fertig, alles gelesen
    }
    

    Ggf ist es bei mehreren Dateien sinnvoller, nicht alle gleichzeitig zu lesen sondern immer nur maximal 3 oder sowas ...



  • manni66 schrieb:

    Wenn das Laden nicht eine aufwändige Bearbeitung der Daten beinhaltet, wird das Lesen mit Threads eher langsamer ablaufen.

    Mal davon abgesehen, ist die Platte ohnehin das Langsamste am Vorgang.

    Threads beim Laden lohnen sich dann, wenn große Datenmengen verarbeitet werden, oder andere Aufgaben gleichzeitig ablaufen müssen, wie z.B ein Ladebildschirm angezeigen, Berechnungen im Hintergrund, etc.



  • manni66 schrieb:

    Wenn das Laden nicht eine aufwändige Bearbeitung der Daten beinhaltet, wird das Lesen mit Threads eher langsamer ablaufen.

    Kommt drauf an. Vielleicht hat das OS die Dateien schon in den RAM geladen, dann geht das Lesen sehr schnell.
    Deshalb ist beim Compilieren oft nicht die Platte das Bottleneck, sondern die CPU.


Anmelden zum Antworten