【问题标题】:C++ asio provide async execution of threadC++ asio 提供线程的异步执行
【发布时间】: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


【解决方案1】:

这里有两个主要问题:

  1. 线程加入 - 在接受新连接之前您正在等待线程完成
  2. 使用 pointer 指向在 stack 上创建的套接字

我建议您进行以下更改:

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

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

【讨论】:

    【解决方案2】:

    那你为什么叫加入呢? join就是等待一个线程完成,而你说不想等待线程,所以,好吧……就不要调用join了?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      相关资源
      最近更新 更多