Зверь вебсокет идиоматическое отключение?

У меня есть программа на C++. Основной поток создает новый поток, который предназначен только для обработки веб-сокета. Этот новый поток читает и пишет, используя, например, вызовы boost beast async_read(). Это очень похоже на https://www.boost.org/doc/libs/1_69_0/libs/beast/example/websocket/server/async/websocket_server_async.cpp где каждый асинхронный вызов вызывает другой асинхронный вызов.

Но каков идиоматический способ заставить основной поток сообщить потоку websocket о завершении работы, учитывая, что, скорее всего, всегда будет происходить какой-то асинхронный вызов чтения или записи, ожидающий ожидания, как сервер async_read(), ожидающий, пока сервер в конце концов не отправит данные. Завершение работы должно было бы сделать что-то вроде отмены оставшейся функции async_read() без введения какого-либо условия гонки, когда чтение начинается непосредственно перед отменой.

1 ответ

Использование boost::asio::post опубликовать лямбду в io_context (используя соответствующие strand при необходимости) какие звонки cancel на основе basic_socket, Ожидающие операции будут немедленно завершены с boost::asio::error::operation_aborted, Внутри вашего обработчика завершения вы можете проверить basic_socket::is_open знать, стоит ли вам предпринимать новые асинхронные вызовы.

Другие вопросы по тегам