Зверь вебсокет идиоматическое отключение?
У меня есть программа на 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
знать, стоит ли вам предпринимать новые асинхронные вызовы.