Boost :: Asio-我应该让io_context :: run线程退出吗?

时间:2018-12-18 04:38:39

标签: c++ boost boost-asio

我正在使用boost :: asio开发异步客户端TCP程序。我对公认的做法有疑问:如果套接字中断或断开连接,我应该让我的io_context线程退出(即不发出任何async_connect请求并让我的run方法退出),让主线程重新启动io_context并尝试async_connect还是应该给async_connect请求阻止退出io_context线程(即发出任何async_connect请求,而不退出我的run方法)。哪种方法更可接受。

按照我的假设,退出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线程退出。

0 个答案:

没有答案