Ich habe meinen eigenen Multithreading-Dienst, der einige Befehle verarbeitet. Der Dienst besteht aus einem Befehlsparser, Worker-Threads mit Warteschlangen und einigen Caches. Ich möchte nicht den Lebenszyklus jedes Objekts im Auge behalten, daher verwende ich shared_ptr's sehr extensiv. Jede Komponente verwendet shared_ptr's auf ihre eigene Weise:
- Der Befehlsparser erstellt shared_ptr's und speichert sie im Cache;
- worker bindet shared_ptr's an Funktoren und stellt sie in die Warteschlange.
- Cache vorübergehend oder dauerhaft einige shared_ptr's enthält.
- die Daten, auf die von shared_ptr verwiesen wird, können auch andere shared_ptr's enthalten.
Und es gibt einen weiteren zugrundeliegenden Dienst (z.B. Befehlsempfänger und -sender), der die gleiche Struktur hat, aber seinen eigenen Cache, Worker und shared_ptr's verwendet. Es ist unabhängig von meinem Dienst und wird von einem anderen Entwickler gepflegt.
Es ist ein kompletter Albtraum, wenn ich versuche, alle shared_ptr-Abhängigkeiten zu verfolgen, um Querverweise zu vermeiden.
Gibt es eine Möglichkeit, einige shared_ptr "Schnittstelle" oder "Politik" zu spezifizieren, so werde ich wissen, welche shared_ptr's ich sicher an den zugrunde liegenden Dienst übergeben kann, ohne den Code zu inspizieren oder mit dem Entwickler zu interagieren? Die Richtlinie sollte den Besitzzyklus von shared_ptr einbeziehen, z. B. hält der Worker den Funktor mit der gebundenen shared_ptr seit dem Aufruf der dispatch()-Funktion und nur bis zu einem anderen Funktionsaufruf, während der Cache die shared_ptr seit dem Konstruktoraufruf des Cache und bis zum Destruktoraufruf des Cache hält.
Insbesondere bin ich neugierig auf die Situation beim Herunterfahren, wenn die Anwendung einfriert, während sie darauf wartet, dass die Threads beitreten.