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:
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 ?
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.
Tags und Links c++ multithreading