Boost Threads mit Dynamischem Namen



  • Hallo alle miteinander,
    ich habe ein kleines Problem ich möchte gerne Boost Threads mit dynamischem Namen erstellen/zuweisen.

    Aktuell erstelle ich mir im Header so:

    boost::thread depth_thread_1;
    boost::thread depth_thread_2;
    

    2 Thread Objekte wenn ich die Theorie richtig verstanden habe.
    In der CPP weise ich aktuell:

    if(i+1 == 1)
    {
        depth_thread_1 = boost::thread [...]
    }
    if (i+1 == 2)
    {
         depth_thread_2 = boost::thread [...]
    }
    

    über diese IF Abfrage jedem Threadobjekt einen Thread zu, Anhand einer ID die ich vergleiche.

    Ich würde jedoch gerne die Zuweisung, als auch das erstellen dynamisch machen.
    D.h. in meinem Fall liefert mir zuvor eine andere Funktion eine Info darüber wieviel Threads ich erstellen muss.
    Und dem entsprechend werden dann die Thread Objekte mit dem Namen "depth_thread_X" angelegt wobei das X eben dynamisch auswechselbar sein soll durch eine Zahl, die ID des Threads quasi.

    Ich hoffe meine Frage kommt verständlich rüber und es kann mir jemand helfen.

    Vielen dank

    Scriper



  • Scriper schrieb:

    Ich hoffe meine Frage kommt verständlich rüber und es kann mir jemand helfen.

    Nein ... bzw zumindestens auf mich wirkt das total wirr. Magst du nicht mal in Pseudocode aufzeichnen was du meinst?



  • D.h. in meinem Fall liefert mir zuvor eine andere Funktion eine Info darüber wieviel Threads ich erstellen muss.

    Speicher die Threads (oder Zeiger darauf) doch in Arrays/Listen/Sets.



  • du solltest dir mal den std::vector anschauen, wenn ich das richtig verstanden hab, was du machen willst. wenn nicht, befolge ethons ratschlag.


  • Mod

    Wie bei anderen Variablen auch, ist die Lösung ein dynamisches Feld. Ich mach's mal für die C++-Threads vor, für Boost Threads ist nichts grundlegend anders:

    #include <thread>
    #include <vector>
    #include <iostream>
    #include <chrono>
    
    using namespace std;
    
    void waste_time(unsigned how_much)
    {
      for(unsigned i = 0; i <= how_much; ++i)
        {
          cout << "This is thread " << how_much << " having wasted " << i << " seconds of your life.\n";
          const chrono::seconds one_second(1);
          this_thread::sleep_for( one_second );
        }
    
    }
    
    int main()
    {
      cout << "How many? ";
      unsigned how_many;
      cin >> how_many;
    
      vector<thread> threads;
      for (unsigned i = 0; i < how_many; ++i)
        threads.push_back(thread(bind(&waste_time, i)));
      for (auto &t: threads)
        t.join();
      cout << "All done.\n";
    }
    


  • Ok dann nochmal anders erklärt mein Problem.

    Ich erhalte von einer Funktion einen Intwert nehmen wir an eine 3.
    Diese 3 sagt mir, ich muss 3 Threads starten mit verschiedenen Startparameter etc.

    Ich möchte nun eben was ich aktuell im Header mache:

    boost::thread depth_thread_1;
    

    was ja starr ist.
    Anders lösen weil ich ja im vornerein nicht weiß wieviel Threads es denn mal werden.
    Ich möchte wenn ich jetzt die 3 erhalten habe.
    boost::thread depth_thread_1; anlegen und diesem objekt dann einen Thread zuweisen

    gleiches gilt für
    boost::thread depth_thread_2;
    und
    boost::thread depth_thread_3;

    Es geht darum das ich quasi eine Art Vorlage habe "depth_thread_x" so wird jedes Thread Objekt mal heißen. Nur, dass das X eben einer anderen Zahl für jeden Thread entspricht.

    Ich hoffe das ist jetzt verständlicher 🙂

    @knivil die Threads existieren ja noch nicht.
    Ich will sie ja erstellen mit unterschiedlichen Namen. Darum gehts mir.
    Aber eben nicht im Header sondern entsprechend wie ich sie brauche in der CPP dann.



  • Und die Antwort lautet immer noch: Das geht so nicht. Variablennamen sind im kompilierten Programm gar nicht mehr vorhanden, daher ergibt das so keinen Sinn. Machs wie von SeppJ vorgeschlagen.



  • Ich kann mich den anderen nur anschließen, allerdings empfehle ich dir boost::thread_group-Klasse und ihre Methoden statt vector zu verwenden.



  • SeppJ schrieb:

    vector<thread> threads;
    threads.reserve( how_many );
    

    FTFY 🤡



  • Sone schrieb:

    SeppJ schrieb:

    vector<thread> threads;
    threads.reserve( how_many );
    

    FTFY 🤡

    Da hast Du falsch zitiert.
    Hätte mich auch gewundert, wenn SeppJ so einen unwichtigen Quatsch machen würde.



  • volkard schrieb:

    Sone schrieb:

    SeppJ schrieb:

    vector<thread> threads;
    threads.reserve( how_many );
    

    FTFY 🤡

    Da hast Du falsch zitiert.
    Hätte mich auch gewundert, wenn SeppJ so einen unwichtigen Quatsch machen würde.

    Wer weiß, vielleicht erstellt er tausend Threads. Würde mich nicht wundern, bei jemandem der Threads nutzt aber denkt er könnte Identifier zur Laufzeit dynamisch erzeugen.



  • Sone schrieb:

    volkard schrieb:

    Sone schrieb:

    SeppJ schrieb:

    vector<thread> threads;
    threads.reserve( how_many );
    

    FTFY 🤡

    Da hast Du falsch zitiert.
    Hätte mich auch gewundert, wenn SeppJ so einen unwichtigen Quatsch machen würde.

    Wer weiß, vielleicht erstellt er tausend Threads. Würde mich nicht wundern, bei jemandem der Threads nutzt aber denkt er könnte Identifier zur Laufzeit dynamisch erzeugen.

    Wieviele Takte wird es kosten, tausend Threads zu basteln?
    Wieviele Takte kosten die 5 extras-new-Aufrufe?
    Du verbaust Dir nur, schmerzfrei den Container wechsel zu können, Du müllst Dir den Code mit Optimierungs-Bloat zu, so wird das nix, kleiner PI-Nachfolger.



  • 5 extras-new-Aufrufe?

    Edit: Stopp. Wovon redest du da? Der wird schon öfter neu allokiert.

    Pi-Nachfolger? Ist es so schlimm? 😞



  • Sone schrieb:

    5 extras-new-Aufrufe?

    Edit: Stopp. Wovon redest du da?

    Schon vom selben. Ok, meinetwegen Faktor 1.5 und Startgröße 16.

    Sone schrieb:

    Pi-Nachfolger? Ist es so schlimm? 😞

    Die Richtung scheint mir gleich. Die Dosis ist noch schwächer.



  • Danke für die Hilfe, es tut mir leid das ich nicht wusste das man Identifier nicht zur Laufzeit dynamisch erzeugen kann. Sone 😞


Anmelden zum Antworten