我有一个简单的服务器应用程序。当新客户端连接时,它处理来自客户端的请求并将数据发送回它。我的问题是提供句柄线程的异步执行。现在,当开始一个句柄线程时,它会停止接受器循环并等待相应函数的返回。 问题是如何在启动句柄线程后组织接受器循环的继续(以便能够同时处理其他连接)?
Server.h:
if ($_GET['sort'] == 'namn')
{
$order = " ORDER BY lastname";
}
elseif ($_GET['sort'] == 'email')
{
$order = " ORDER BY email";
}
$result = mysqli_query($mysqli,"SELECT rid, pid, firstname, lastname, email FROM temp_members_db WHERE pid='$pid1' ".$order);
echo "<br><table><tr class='tabletop'><th><a href='mypage.php?sort=namn'>Namn</a></th><th><a href='mypage.php?sort=email'>E-mail</a></th><th>Resultat</th><th>Ta bort kandidat</th></tr>";
Server.cpp
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();
};
答案 0 :(得分:1)
那你为什么打电话加入?加入是关于等待线程完成,你说你不想等待线程,所以,好吧......只是不要调用join?
答案 1 :(得分:1)
这里有两个主要问题:
我建议你改变这个:
boost::asio::ip::tcp::socket clientSock (service);
acceptor->accept(clientSock); //new socket accepted
std::cout << "New client joined! ";
std::thread{std::bind(&Server::HandleRequest, this, std::placeholders::_1), std::move(clientSock)}.detach();
HandleRequest将改为:
void Server::HandleRequest(boost::asio::ip::tcp::socket&& clientSock)
{
if (clientSock.available())
{
//Works with socket
}
}
您也可以将线程存储在某处并稍后加入,而不是分离。