c++ - Boost Asio 多线程 TCP 同步服务器

标签 c++ multithreading boost boost-asio

我正在尝试创建一个 tcp 同步服务器。我的主线程将创建监听一个端口,传入的连接将由一个线程处理。

我的代码:

void WorkerThread(boost::shared_ptr< boost::asio::io_service >  io_service)
{
    io_service->run();
}

void Application::server()
{
        boost::shared_ptr< boost::asio::io_service > io(
            new boost::asio::io_service()
            );
        boost::shared_ptr< boost::asio::io_service::work > work(
            new boost::asio::io_service::work(*io)
            );
        // Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR
        boost::asio::ip::tcp::acceptor acceptor(*io);
        boost::asio::ip::tcp::endpoint endpoint(boost::asio::ip::tcp::v4(), 2198);
        acceptor.open(endpoint.protocol());
        acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
        acceptor.bind(endpoint);
        acceptor.listen();              

        // pool of threads
        boost::thread_group worker_threads;
        for(int x = 0; x < 5; ++x)
        {
            worker_threads.create_thread(boost::bind(&WorkerThread, io));
        }

        while(true)
        {
            boost::shared_ptr< boost::asio::ip::tcp::socket > socket(
                new boost::asio::ip::tcp::socket( *io )
                );
            acceptor.accept(*socket);
            processConnection(*socket);
            socket->close();
        }

        io->stop();
        worker_threads.join_all();

}

void Application::processConnection(boost::asio::ip::tcp::socket & socket)
{
    boost::asio::streambuf request_buffer;
    std::istream request_stream(&request_buffer);
    // repsonse buffer
    boost::asio::streambuf response_buffer;
    std::ostream response_stream(&response_buffer); 
    boost::asio::read_until(socket, request_buffer, "</message>"); 

    // process request_buffer into response_buffer

    boost::asio::write(socket, response_buffer);

}

以下是使用多个连接到服务器的客户端;但是,如果我删除线程池,它也可以工作。谁能解释我为什么会这样?我什至需要一个线程池吗?

最佳答案

however, it also work if I remove the pool of thread. Can anyone explain me why that is? Do I even need a pool of threads?

根据您的示例代码,您不需要线程池。无需在您的上下文中调用 io_service::run(),请参阅 documentation

The run() function blocks until all work has finished and there are no more handlers to be dispatched, or until the io_service has been stopped.

您尚未向 io_service 添加任何处理程序,因此无需调用 run()。如果您使用异步方法,例如 async_accept() ,那么您将需要run() io_service

关于c++ - Boost Asio 多线程 TCP 同步服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8127080/

相关文章:

c++ - 灵气中如何在字符串属性开头插入一个字符

c++11: std::enable_shared_from_this 现实生活中的例子?

c++ - 每次运行此 C++ 程序时如何获得不同的数字?

c++ - 您使用什么类型的负面图像进行 Haar-like 特征训练重要吗?

multithreading - 如何避免基于任务的程序的递归任务列表遍历?

c++ - 如何安装 boost::contract?

c++ - 所有不同质数的和等于 100

c++ - 故意隐藏重载函数警告避免

python - 多线程 S3 下载不会终止

java - 我应该在多线程程序中使用连接池吗?