Я разрабатываю асинхронную клиентскую TCP-программу с использованием boost :: asio.У меня есть вопрос относительно принятой практики: в случае, если сокет разрывается или отключается, я должен позволить моему потоку io_context завершить работу (т.е. не выдавать какой-либо запрос async_connect и позволить моему методу выполнения выйти) и позволить основному потоку перезапустить io_context и попробовать async_connect или я должен дать запрос async_connectчтобы остановить мой поток io_context от выхода (т.е. выполнить любой запрос async_connect и не позволить моему методу выполнения выйти).Какой подход является более приемлемым.
Согласно моему предположению, преимущество выхода из потока io_context состоит в том, что вы начинаете с нового чистого потока (вы начинаете с нового листа), а недостатком является больше вычислений, требований к ресурсам и времени выполнения..
Напротив, если продолжить работу с моим текущим потоком io_context, т.е. я даю запрос async_connect, чтобы остановить выход из потока io_context, я экономлю на вычислениях, потребностях в ресурсах и времени выполнения, но не получаю чистого листа.
Какой из этих двух методов более целесообразен?
void AsyncSocket::recieveHandler(const boost::system::error_code& ec, std::size_t bytes_transferred)
{
fmt::print("In recieve handler, Error Code : {}\nBytes recieved : {}\n", ec.message(), bytes_transferred);
try
{
std::atomic_store(std::addressof(this->receivingData), false);
if (ec not_eq boost::system::errc::success)
{
#ifdef _DEBUG
fmt::print("Error in WebSocket::recieveHandler. Error : {0}\n", ec.message());
#endif // _DEBUG
LOG_ERROR << ec.message();
switch (ec.value())
{
case boost::asio::error::eof :
case boost::asio::error::connection_reset :
case boost::asio::error::connection_aborted :
case boost::asio::error::network_reset :
case boost::asio::error::network_down :
case boost::asio::error::network_unreachable :
if (this->isSocketAlive() and this->socket.is_open())
this->socket.close();
std::atomic_store(std::addressof(this->socketAlive), false);
//this->connectSocket(); //[1]
return;
default:
break;
}
}
else
{
this->readDataQueue.push(std::string(reinterpret_cast <const char *> (this->readDataBuffer.data()), bytes_transferred));
std::atomic_store(std::addressof(this->readComplete), true);
}
}
catch (const std::exception& ex)
{
#ifdef _DEBUG
fmt::print("Error in WebSocket::sendHandler. Error : {0}\n", ex.what());
#endif // _DEBUG
LOG_ERROR << "Exception : " << ex.what() << "Data : " << this->writeDataQueue.front();
}
this->recieveDataSocket();
}
Комментирование 1 позволяет завершить поток io_context, а снятие комментариев останавливает остановку потока io_context.