У меня есть простое серверное приложение. Когда новый клиент подключается, он обрабатывает запрос от клиента и отправляет ему данные. Моя проблема состоит в том, чтобы обеспечить асинхронное выполнение потока обработки. Теперь, когда запущен дескриптор потока, он останавливает цикл акцептора и ждет возврата соответствующей функции. Вопрос в том, как организовать продолжение цикла акцептора (чтобы иметь возможность одновременно обрабатывать другое соединение) после запуска потока обработки?
Сервер.ч:
class Server
{
private:
//Storage
boost::asio::io_service service;
boost::asio::ip::tcp::acceptor* acceptor;
boost::mutex mtx;
//Methods
void acceptorLoop();
void HandleRequest(boost::asio::ip::tcp::socket* clientSock);
public:
Server();
};
Сервер.cpp
void Server::acceptorLoop()
{
std::cout << "Waiting for clients..." << std::endl;
while (TRUE)
{
boost::asio::ip::tcp::socket clientSock (service);
acceptor->accept(clientSock); //new socket accepted
std::cout << "New client joined! ";
boost::thread request_thread (&Server::HandleRequest, this, &clientSock); //create a thread
request_thread.join(); //here I start thread, but I want to continue acceptor loop and not wait until function return.
}
}
void Server::HandleRequest(boost::asio::ip::tcp::socket* clientSock)
{
if (clientSock->available())
{
//Works with socket
}
}
Server::Server()
{
acceptor = new boost::asio::ip::tcp::acceptor(service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 8001));
acceptorLoop(); //loop started
}