Warum wird hier (boost.asio example) shared_ptr verwendet?



  • Hi,

    beim boost.asio Beispiel "http-server2" wird ja ein io_service pro CPU verwendet. Hierzu gibt es die Klasse io_service_pool (die Files sind hier zu finden:
    http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/http/server2/io_service_pool.cpp
    http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/http/server21/io_service_pool.hpp
    )

    Dabei kommen shared_ptr auf die einzelnen io_service-Objekte in einen vector. Außerdem kommen in einen anderen vector genauso viele io_service::work-Objekte (auch wieder mittels shared_ptr).

    Dazu habe ich ein paar Verständnis-Fragen:
    a) Die shared_ptr werden direkt per "new" in den vectors abgelegt.. ich dachte das wäre ungünstig und sollte nur per make_shared passieren, oder ist das gleich mien erster Irrtum?
    b) Warum werden hier überhaupt shared_ptr verwendet? Bei dem vector mit den io_service::work-Objekten muss man diese zurücksetzen können wenn man möchte dass die io_service-Objekte keine Arbeit mehr, das ginge dann per reset (wird aber hier gar nicht verwendet, würde in der stop()-Methode sinn machen, vor dem io_service.stop() ), aber das ginge doch auch mit einem unique_ptr? Und so wie es hier gezeigt wird bräuchte man doch gar keinen shared/unique_ptr?
    c) Und bei den io_service-Objekten fällt mir überhaupt kein Grund mehr ein warum der shared_ptr verwendet wird, die könnten doch einfach direkt in den vector gelegt werden..

    Da asio doch von erfahrenen Leuten geschrieben wurde vermute ich dass ich noch irgendwo Verständis- oder Wissens-Probleme hab, wäre daher um Aufklärung sehr dankbar!

    Grüße, gibbet!



  • Zu a) Durch make_shared hat vor allem Performancegründe. Da hier aber Ressourcen beim Programmstart alloziert werden und erst beim Programmende wieder freigegeben werden, spielt das für dieses Beispiel keine große rolle.

    Zu b) und c) Die Beispiele kommen aus prä-C++11 Zeiten (und sollen auch mit C++03 laufen). io_service ist noncopyable. Da es in C++03 keine rvalue-Referenzen gibt, kannst Du den io_service also weder in den vector moven noch emplacen. Der shared_ptr ist hier also die beste Wahl für einen Pool von io_service-Objekten. io_service::work ist hat zwar einen Copy-Ctor aber keinen Zuweisungsoperator. Die Gründe dürften hier also ähnlich liegen.



  • Zu a) Das muss ich mir dann nochmal anschauen wann ich das verwende und wann nicht
    Zu b) Ha, da hab ich tatsächlich nicht dran gedacht, mit dem noncopyable.. das leuchtet natürlich ein.

    Vielen Dank, das hat mir auf jeden Fall weiter geholfen!


Log in to reply