C ++ asio提供线程的异步执行

时间:2016-10-15 12:32:05

标签: c++ multithreading boost-asio

我有一个简单的服务器应用程序。当新客户端连接时,它处理来自客户端的请求并将数据发送回它。我的问题是提供句柄线程的异步执行。现在,当开始一个句柄线程时,它会停止接受器循环并等待相应函数的返回。 问题是如何在启动句柄线程后组织接受器循环的继续(以便能够同时处理其他连接)?

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();
};

2 个答案:

答案 0 :(得分:1)

那你为什么打电话加入?加入是关于等待线程完成,你说你不想等待线程,所以,好吧......只是不要调用join?

答案 1 :(得分:1)

这里有两个主要问题:

  1. 线程加入 - 您在接受新连接之前等待线程完成
  2. 指针用于堆栈上创建的套接字
  3. 我建议你改变这个:

        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
        }
    }
    

    您也可以将线程存储在某处并稍后加入,而不是分离。