Разъяснение о правильном выключении сервера Boost BeastC++

Программы на C++. Форум разработчиков
Anonymous
Разъяснение о правильном выключении сервера Boost Beast

Сообщение Anonymous »

Я работаю с примером расширенного сервера Boost Beast (доступен на сайте Boost.org) и использую его в качестве основы для своего собственного сервера. Насколько я понимаю, в этом примере и сеанс, и слушатель являются самостоятельными объектами; они поддерживают себя, всегда присоединяя свой Shared_ptr к обработчику обратного вызова. Этот дизайн кажется очень элегантным и практичным, поскольку он упрощает обработку ошибок, позволяя структуре самоуничтожаться, когда нет ожидающих асинхронных операций.
Однако мне неясно, как вся система отключена. Код сначала вызывает ioc.stop(), а затем присоединяется к соответствующим потокам. Сначала я думал, что ioc.stop() будет обрабатывать любые ожидающие обработчики и связанные с ними Shared_ptrs, но, похоже, это не так. Кажется более вероятным, что все оставшиеся обработчики уничтожаются при окончательном уничтожении самого ioc, тем самым очищая все оставшиеся Shared_ptr.
В моей серверной реализации я обрабатывал это с помощью unique_ptr для io_context и явно сбрасываю его в деструкторе моего сервера:

Код: Выделить всё

HTTPServer::HTTPServerImpl::~HTTPServerImpl()
{
m_ioc->stop();

for (auto& thread : m_iocThreads)
thread.join();

m_ioc.reset(); // reset the unique_ptr
}
У меня есть несколько вопросов относительно этого процесса завершения работы:
1.) Является ли процедура завершения работы в ~HTTPServerImpl, взятой из примера, считается «чистым» с точки зрения правильного закрытия всех розеток? Как именно это происходит? Через деструкторы зверя::tcp_stream и tcp::acceptor, когда Shared_ptrs уничтожает? Или я должен явно вызвать cancel()/close() перед stop() через какой-нибудь слабый_ptr (разрешено ли это отменить/закрыть из основного потока? Это потокобезопасно?)? Все ли асинхронные операции прерываются во время m_ioc.reset() или некоторые обработчики все еще выполняются (например, таймеры)?
2.) Что именно делает stop() в этом контексте? Это просто предотвращает добавление новых обработчиков или это нечто большее? В документе написано «отказ от незавершенных операций», что именно это означает? Я не вижу, чтобы это что-то остановило. Никакие таймеры также не прерываются преждевременно.

Подробнее здесь: https://stackoverflow.com/questions/784 ... ast-server

Вернуться в «C++»