【发布时间】:2016-10-15 12:32:05
【问题描述】:
我有一个简单的服务器应用程序。当新客户端连接时,它处理来自客户端的请求并将数据发送回它。我的问题是提供句柄线程的异步执行。现在,当开始一个句柄线程时,它会停止接受器循环并等待相应函数的返回。 问题是启动一个句柄线程后如何组织acceptor循环的延续(能够同时处理其他连接)?
服务器.h:
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
}
【问题讨论】:
-
将胎面保存在例如一个向量,不要在创建线程后立即加入。此外,您必须使用其他方式来处理
clientSock对象,因为现在您传递一个指向对象的指针,一旦循环迭代,该对象将超出范围(并被破坏)。
标签: c++ multithreading boost-asio