ускорить обработку многопоточных сокетов tcp и сбросить с помощью shared_pointer - PullRequest
0 голосов
/ 08 октября 2019

Я поддерживаю устаревшее многопоточное приложение, содержащее tcp-серверы и клиентов. Вызовы открытия, закрытия и т. Д. Поступают из другого потока.

Каждый tcp-сервер / клиент имеет элемент сокета в shared_ptr для простого воссоздания сокета при переподключении:

m_strand.dispatch([this, iter]() {
    m_socket.reset(new boost::asio::ip::tcp::socket(m_ioService));
    m_socket->async_connect(iter->endpoint(), boost::bind(&Client::onConnect, this, boost::asio::placeholders::error));
});

У них также есть элемент стренги для обеспечения одновременного вызова обработчиков чтения / записи и т. Д .:

m_strand.dispatch([this]() {
    if (m_socket) {
        boost::system::error_code ec;
        m_socket->cancel(ec);
        m_socket->shutdown(boost::asio::socket_base::shutdown_both, ec);
        m_socket->close(ec);
}});

Однако отправка (и запись) переносятся следующим образом:

m_socket->async_send(
    boost::asio::buffer(buffer->str(), buffer->len() + 1),
    m_strand.wrap(boost::bind(&Client::onSend, this, boost::asio::placeholders::error, bufferIdx)));

Вопрос(1): Может ли это случиться так, что при вызове этого Client :: onSend m_socket теперь является «воссозданным» из более раннего метода повторного подключения, и если да, это будет проблемой (m_socket не используется в Client ::обработчик onSend)?

К сожалению, прослушивающая часть tcp-сервера выполняется из внешнего класса, который обращается к сокету и цепи через член:

Server *srv = ...
m_acceptor.async_accept(
    *srv->socket(),
    srv->strand().wrap(boost::bind(&Listener::onAccept, this, ctx, boost::asio::placeholders::error)));

Вопрос (2):это та же самая ситуация, что и в вопросе (1), где вызов onAccept может быть рискованным, если сокет воссоздан между ними, или это может быть дополнительной проблемой при передаче сокета viпрямая ссылка?

Заранее спасибо!

...