Boost :: Asio - Должен ли я позволить io_context :: run thread завершиться? - PullRequest
0 голосов
/ 18 декабря 2018

Я разрабатываю асинхронную клиентскую 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.

...