Thread Beendigung abhandeln



  • Ich besitze eine Liste aus 4 threads, die stätig mit Aufgaben gefüttert werden sollen.
    Allerdings muss ich dazu wissen, wann die Threads fertig sind, da sie weder nach "fire and forget" oder als Daemon laufen sollen.
    Ich bin normalerweise daran gewöhnt, dass ich einem Thread eine Prozedur geben kann, die nach seiner Beendigung ausgeführt wird.
    Ich habe nichts gefunden, dass mir weiterhilft.

    Hier ein keiner Abriss, wie das ungefähr aussehen wird:

    (Fehler sind möglich, da aus Gedächtnis rekonstruiert)

    class WorkerPool {
    private:
        std::vector <std::thread> Workers;
        // Vielleicht auch: std::vector <std::pair <std::thread, bool> > Workers;
        void AddTask(void (Task*)(PARAM_TYPE parm));
    }
    
    WorkerPool::AddTask(void (Task*)(PARAM_TYPE parm)) {
        // Thread auswählen? Aber welcher hat den grad nichts zu tun?
    }
    


  • lass die Threads selbst den nächsten Task abrufen und weiß nicht du den zu

    greetz KN4CK3R



  • KN4CK3R schrieb:

    lass die Threads selbst den nächsten Task abrufen und weiß nicht du den zu

    hmmm...

    Ich glaube ich klebe in einem Funktionsobjekt die übergebene Prozedur und eine weitere Prozedur, die das macht, zusammen.
    Oder die zweite Prozedur setzt den Thread wieder auf "verfügbar"... hmmm.
    Aber dann würde ich sicher Gefahr laufen, dass der Thread überschrieben wird, kurz bevor er beendet wurde, nämlich kurz nachdem der Thread als "frei" geflaggt wurde...



  • du hast doch eine klassische Producer Consumer Situation vor dir, wenn ich das Recht sehe...
    Der Producer schiebt immer Arbeit in einen Buffer und die Threads warten darauf, dass neue Arbeit anliegt. Ein Thread holt sich diese aus dem Buffer und reiht sich danach wieder in die Warteschleife ein.

    Edit: ich hab mal das Beispiel von hier benutzt in einer etwas veränderten Version. (C#) http://www.albahari.com/threading/part4.aspx Abschnitt Producer/Consumer Queue

    greetz KN4CK3R


Anmelden zum Antworten