Erhalte einen std :: -Thread, um sich selbst zu trennen und zu beenden

8

Ich entwickle gerade einen grundlegenden Thread-Pool. Ich habe c ++ 11% std::thread zusammen mit std::condition_variable und std::unique_lock verwendet. Es scheint zu funktionieren, und ich möchte jetzt in der Lage sein, einige Threads zu töten, wenn zu viele von ihnen inaktiv sind. Fürs Erste werden ihre Jobs durch std::queue of boost::function s vergeben. Ich dachte daran, ein paar leere boost::function s hinzuzufügen, damit die Threads wissen, dass sie ihre Schleife verlassen müssen. Die Schleife des Threads ist wie folgt:

%Vor%

Die Sache ist, ich bin mir nicht sicher, wie ich den Thread richtig lösen soll, sobald ich die Schleife verlassen habe. Wäre es sauber, nach dem Handle des Threads zu suchen (ich habe Zugang zu std::list<std::thread*> und kann ihre IDs mit std::this_thread::get_id() vergleichen), und ist es sicher, detach() vom Thread selbst oder sogar join() aufzurufen ?

    
Jukurrpa 02.02.2012, 18:19
quelle

1 Antwort

11

Ja, wenn Sie alle Thread-Objekte gespeichert haben, können Sie diejenige finden, bei der thread::id gleich this_thread::get_id() ist, und Sie können detach() darauf aufrufen und danach das Thread-Objekt zerstören (das C + +11 Standard verhindert das nicht, und ich glaube, dass es auf der üblichen Praxis basiert). Stellen Sie sicher, dass kein anderer Ausführungsthread auf die Instanz von std::thread zugreift, die zerstört wurde.

Sie können jedoch join() nicht vom Thread selbst aufrufen: Ein Versuch, dass ein Thread mit sich selbst verbunden wird, würde zu einem Deadlock führen, und C ++ 11-Implementierungen sollten dies erkennen und system_error mit der Fehlerbedingung% ausgeben co_de%.

Alternativ können Sie eine Nachricht (z. B. über eine std :: atomic-Variable) an den Haupt-Thread, den der mit einer bestimmten Instanz von resource_deadlock_would_occur verknüpfte Thread gerade abschließt, schreiben und den Haupt-Thread mitmachen lassen Diese Instanz zu einem späteren Zeitpunkt.

    
Alexey Kukanov 02.02.2012, 19:57
quelle

Tags und Links