Много играл с Boost.Asio в последнее время. Мне очень нравится библиотека, так как она предлагает фантастический способ сжать производительность из сегодняшних многоядерных систем.
Вопрос, который я задал себе несколько раз, и я подумал о том, что стоит потратить туда время жизни/права объекта при создании асинхронных вызовов с помощью Asio.
Проблема, о которой я неоднократно говорил, заключается в том, что вам довольно часто приходится "истекать" с объектом, у которого все еще есть асинхронные обратные вызовы. Если этот объект выходит за пределы области действия до того, как обратный вызов будет вызван, все неизбежно начнется.
Для борьбы с этим я использовал шаблон boost::enable_shared_from_this
в качестве базового класса для большинства классов, основанных на asio. Это работает нормально, но это немного обременительно: обычно это также означает защиту конструктора и добавление метода factory к классу, чтобы гарантировать, что все экземпляры создаются внутри shared_ptr.
Я просто хотел узнать, как другие люди справились с этой проблемой. Я иду об этом лучше всего? Или я получил свой Asio.Foo все неправильно?
Обсудить...:)