Однако мне неясно, как вся система отключена. Код сначала вызывает 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