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