Vector



  • Guten Abend,

    ich habe einen Vektor der eine variable Anzahl an Strukturen enthält.

    Dieser Vektor wird über eine Funktion geupdated. ( sprich clear, und füllen)

    Der Vektor wird jedoch durch 2 Funktionen verwendet ( jeweils 1x For-Schleife)

    Wenn der Vector jetzt geupdatet wird durch die Updatefunktion, kann es ja passieren dass die eine oder andere Funktion nicht mehr die richtigen Werte abgreifen kann. (sprich wenn gerade der Vektor geleert wird, und der forloop gerade an dieser Stelle ist, bzw eins davor?)

    //thread zum updates des vectors
    void mUpdateThread()
    {
    	for (;;)
    	{
    		UpdatePlayerVector();
    		std::this_thread::sleep_for(std::chrono::milliseconds(5));
    	}
    }
    
    void UpdatePlayerVector()
    {
    	// clear, ziemlich dumme Lösung, da die größe des Vectors immer anders ist/sein könnte.
    
    	playerInformation.clear();
    
    	for (int i = 0; i < 1004; ++i)
    	{
    
    		// .. 
    		// ..
    		// if true ..
    
    		player.SetID(i);
    		player.SetPosition(position);
    		player.SetHitpoints(fHP);
    		player.SetAliveState(isAlive);
    		player.SetAFKState(isAFK);
    		player.SetColor(playerColor);
    		player.SetVisible(isVisible);
    
    		playerInformation.push_back(player);
    
    	}
    
    }
    

    Wie kann ich verhindern, dass wenn der Vektor geleert wird, und der forloop gerade durch den Vektor iteriert, dass keine Fehlerhaften Ausgaben zustande kommen?

    Sorry für die dumme Erklärung, bin noch recht neu 😃

    Lg, Chris



  • Die entscheidende Information verschweigst du: du benutzt Threads. Die dürfen geteilte Dazen natürlich nicht gleichzeitig verändern (wie du ja schon selbst erkannt hast). Was dagegen zu tun ist, füllt Bücher und geht über die Möglichkeiten eines Forums weit hinaus. Eine Möglichkeit wäre ein Mutex, der den Vector schützt.



  • Nein, ich denke nicht, dass er verschiedene Threads benutzt, sondern einfach nur über einen vector iteriert und die selbe Referenz innerhalb der Schleife verändert.

    Du könntest statt über das Original einfach über eine Kopie iterieren, aber grundsätzlich würde ich dein Design nochmal überdenken.


  • Mod

    wörtner schrieb:

    Nein, ich denke nicht, dass er verschiedene Threads benutzt,

    Sicher?

    Jenson schrieb:

    //thread zum updates des vectors
    void mUpdateThread()
    


  • Naja, ich bin mir ziemlich sicher, dass er das Game auch single-threaded hinkricht.


Anmelden zum Antworten