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