Я использую boost asio для обработки сеанса в потоке следующим образом:
Server::Server(ba::io_service& ioService, int port): ioService_(ioService), port_(port)
{
ba::ip::tcp::acceptor acceptor(ioService_, ba::ip::tcp::endpoint(ba::ip::tcp::v4(), port_));
for (;;)
{
socket_ptr sock(new ba::ip::tcp::socket(ioService_));
acceptor.accept(*sock);
boost::thread thread(boost::bind(&Server::Session, this, sock));
}
}
void Server::Session(socket_ptr sock)
{
const int max_length = 1024;
try
{
char buffer[256] = "";
// HandleRequest() function performs async operations
if (HandleHandshake(sock, buffer))
HandleRequest(sock, buffer);
ioService_.run();
}
catch (std::exception& e)
{
std::cerr << "Exception in thread: " << e.what() << "\n";
}
std::cout << "Session thread ended \r\n"; // THIS LINE IS NEVER REACHED
}
В Server :: Session () я в какой-то момент выполняю async io, используя функции async_read_some () и async_write ().Все работает хорошо, и для того, чтобы это работало, мне нужно вызвать ioService_.run () внутри моего потока вызова, в противном случае функция Server :: Session () завершается, и она не обрабатывает требуемую работу ввода-вывода.
Проблема в том, что ioService_.run (), вызванный из моего потока, приведет к тому, что поток вообще не закроется, потому что в то же время другие запросы приходят к моему сокету прослушивающего сервера.
В результате я получаю потоки, запускающие и обрабатывающие сеансы, но никогда не освобождающие ресурсы (заканчивающиеся).Можно ли использовать только один boost :: asio :: io_service при использовании этого подхода?