thread frage



  • hi,

    ich habe eine klassenmethode in der ich über einen bestimmten zeitraum eine gewisse anzahl threads am laufen haben möchte die alle das gleiche tun.

    void Handler::start(std::size_t request_amount, std::size_t minutes)
    {
    	using namespace std::chrono;
    
    	system_clock::time_point timepoint = system_clock::now();
    	std::vector<std::thread> threadpool(request_amount);
    
    	while (timepoint.time_since_epoch().count() * system_clock::period::num / system_clock::period::den < minutes * 60)
    	{
    		for (std::size_t i = 0; i < threadpool.size(); ++i)
    		{
    			threadpool[i] = std::thread(&Handler::execute, this);
    			threadpool[i].detach();
    		}
    	}
    }
    

    Jetzt möchte ich, dass wenn ein Thread fertig ist dieser "erneuert" wird. Wie kann ich feststellen ob der mit detach() modifizierte Thread fertig ist?

    Grüße



  • Ich bin mir nicht ganz sicher; aber wird der thread mit detach() nicht so etwas wie freigegeben in dem Sinne: mach fertig wenn du kannst und räume dich selbst auf (Ressourcen).
    Zitat aus http://www.ijon.de/comp/tutorials/threads/create.html:" Ein solcher Thread läuft dann ohne jegliche äußere Kontrolle bis zum Ende. Es gibt von außerhalb keine Möglichkeit, festzustellen, ob er sich schon beendet hat, oder seinen Rückgabewert zu bekommen. Sein Identifier wird ungültig, wenn er sich beendet.".
    Mal so schnell als Idee: Ich würde einen Threadpool von Objekten mit Status und Referenz auf einen Thread bauen. Der Thread könnte dann den Status setzen und über den Threadpool wüsste ich jetzt, wie der Status des referenzierten Threads wäre.
    Gruß



  • Möglichkeit 1: Du nimmst ein atomic<bool> pro Thread, das von jedem Handler auf true gesetzt wird, lässt das detach weg (was soll das da eigentlich?) und joinst.
    Möglichkeit 2: Du benutzt thread::native_handle und OS-spezifische Funktionen.
    Möglichkeit 3: Du benutzt async + future statt thread und fragt mit future::wait_for ob der Thread schon fertig ist.

    Nichts davon erscheint mir eine gute Lösung. Die korrekte Lösung ist future::then, aber das ist noch nicht Standard. Boost 1.55 hat es scheinbar auch noch nicht, soll aber kommen. Du kannst es auch selbst (ab-)schreiben, mit gewissen Mängeln.


Anmelden zum Antworten