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

Posted

技术标签:

【中文标题】C++ asio 提供线程的异步执行【英文标题】:C++ asio provide async execution of thread 【发布时间】: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 对象,因为现在您传递一个指向对象的指针,一旦循环迭代,该对象将超出范围(并被破坏)。 【参考方案1】:

这里有两个主要问题:

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

我建议您进行以下更改:

    boost::asio::ip::tcp::socket clientSock (service);
    acceptor->accept(clientSock); //new socket accepted
    std::cout << "New client joined! ";
    std::threadstd::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了?

【讨论】:

以上是关于C++ asio 提供线程的异步执行的主要内容,如果未能解决你的问题,请参考以下文章

C++ Boost.Asio - tcp 套接字异步写入

C++ Boost Asio 简单聊天教程

课二:前摄器设计模式(不使用多线程并发)

C++ 线程与 boost asio

从套接字和 STDIN 提升 Asio 多线程

asio 多线程高性能异步服务器