Ich habe in letzter Zeit viel mit Boost.Asio gespielt. Ich mag die Bibliothek sehr, da sie eine fantastische Möglichkeit bietet, die Leistung der heutigen Multicore-Systeme zu verbessern.Was ist die beste Methode, um die Lebensdauer eines Objekts bei Verwendung von Boost.Asio zu gewährleisten?
Eine Frage, die ich mir ein paar Mal gestellt habe, und ich dachte, es lohnt sich, die Objektrelation/Eigentumsrechte wegzuwerfen, wenn Async-Anrufe mit Asio gemacht werden.
Das Problem, das ich wiederholt habe, ist, dass Sie ziemlich oft ein Objekt "auslaufen lassen" müssen, das noch Async-Rückrufe ausstehen muss. Wenn dieses Objekt den Bereich verlässt, bevor der Rückruf aufgerufen wird, werden die Dinge unweigerlich zum Knall.
Um dies zu bekämpfen, habe ich die Vorlage boost::enable_shared_from_this
als Basisklasse für die meisten asio-basierten Klassen verwendet. Dies funktioniert in Ordnung, aber es ist ein wenig beschwerlich: Normalerweise bedeutet dies auch, den Konstruktor zu schützen und der Klasse eine Factory-Methode hinzuzufügen, um sicherzustellen, dass alle Instanzen in einem shared_ptr erstellt werden.
Ich wollte nur wissen, wie andere Leute dieses Problem angegangen sind. Gehe ich das am besten? Oder habe ich meine Asio.Foo alle falsch?
Diskutieren ... :)
Interessant erwähnen Sie dieses Szenario: mein Kollege (bekannt hier als Alan) tat das gleiche wie Sie und ich erwähnte die "Lösung", die ich gefunden hatte, denn für mich war es das gleiche Problem. Ich bin immer noch nicht glücklich mit ihm: Ich mag den Mangel an Determinismus nicht, aber dann, das ist Threading für Sie – jkp